基于.net mvc的校友录 七 文件上传以及多对多关系表的LINQ查询实现

图片的上传与调用

图片的上传就是文件的上传,在前台使用的是type="file"的input,但是,要将表单声明为multipart/form-data模式,方法是在BeginForm中这样写:@using (Html.BeginForm("ToCreate", "Class",FormMethod.Post, new { enctype = "multipart/form-data" })),用对象的形式将enctype的类型定义成multipart/form-data。这样,后台就可以从缓存中取得file了。看一下后台:

HttpPostedFileBase fc = Request.Files[0];

if (fc != null)

{

   newClass.ClassCoverPath =FileHelper.SaveFile(fc);

}

最上面是从Request请求中提取第一个文件,然后放到HttpPostedFileBase类型的fc中,判定fc是否为空,因为有的用户不上传,这个时候就是空的,不执行保存操作,若是不为空,那么将执行FileHelper.SaveFile(fc)。这个方法是一个工具类。代码如下:

string fullname = file.FileName;

string extname = fullname.Substring(fullname.LastIndexOf(".") + 1, fullname.Length - 1 - fullname.LastIndexOf("."));

string newName = DateTime.Now.ToLongTimeString().Replace("/","").Replace(":","").Trim() + "." + extname;

file.SaveAs( Path.GetFullPath("E:/ensleep/Documents/Visual Studio 2012/Projects/AlumniBook/AlumniBook/Upload/")+newName);

return newName;

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/net/

首先是从file中(fc中)获取文件名,然后将文件名切割,取出其中的扩展名,然后再用DateTime.Now取得当前时间,再调用ToLongTimeString()方法生成长型时间字符串,将其中的“/”、“:”等不合法的字符去掉,然后加上扩展名作为文件的新名字,然后用SaveAS方法将文件流保存至本地的Upload文件夹,最后返回文件的新名称。在控制器收到新名称之后,将新名称给实体,再保存到数据库,下次调用的时候,只需要取出图片名,在前面加上路径,就能直接引用了。

linq实现的数据集多表联合查询

对于linq的数据集查询,花费了不少的时间,虽然结果是很简单的,但是每一个有类似经历的人都会知道,过程竟是那样的漫长与困难。在用户登陆之后,个人中心需要显示用户所在的所有班级,即模型MyClass中的IsMyClass。

public class MyClass

{

   public UserInfo MyInfo { get; set; }

   public List<Class> IsMyClass { get; set; }

   public List<Class> NotMyClass { get; set; }

}

这是一个List类型,是一个数据集合。然后还需要另外一个List集合,就是NotMyClass,他们分别存放用户在的班级和不在的班级。这个问题看似很简单,其实,用户与班级之间是用表关联的,也就是多对多的关系。一个班级可以有多个用户,一个用户也可以有多个班级。若是用sql语句当然好写了,网上的方案有许多,用外联查询就可以了。但是在这里,linq不支持outer join!这样问题就出来了。过程不说了,就说结果吧。先来看如果将IsMyClass查询出来:

var query0 = from uc in db.User_Class

      join u1 in db.UserInfo on uc.UserName equals u1.UserName

      join c1 in db.Class on uc.ClassName equals c1.ClassName

      where u1.UserName == username

      select c1;

这是sql中常见的左连接,这个方法linq里面有,我将class、user两张表通过User_Class连接到了一起,然后进行查询,最后取出class。这个还算可以,因为和sql差不多,但是NotMyClass就纠结了,想方设法找了多种方法,也请教了几个正在写书的人,他们都没有调出来,最后推荐使用含集合类型成员的实体,就是可以让Class作为成员,放在User中。即在User中声明一个public List<Class> Class{get;set;}的成员,这个问题在说明书的开始部分有说过,并不稳定,而且系统也会默认建立一张关系表,同学也不建议这样使用。所以,最后想到了一种办法,就是抛弃数据库,直接把集合查到内存里面,然后进行集合操作,也就是说,把所有班级查出来放到NotMyClass中:

mc.IsMyClass = query0.ToList<Class>();

mc.NotMyClass = db.Class.ToList();

foreach(Class rc in mc.IsMyClass)

{

       mc.NotMyClass.Remove(rc);

}

然后再将IsMyClass中的实体遍历,从NotMyClass中Remove掉。这虽不是最原始的解决方法,但是,却是一种思想,复杂的数据库查询,放到内存中进行集合处理,这样直观而且不容易出错。

时间: 2024-10-30 14:58:00

基于.net mvc的校友录 七 文件上传以及多对多关系表的LINQ查询实现的相关文章

PHP MVC框架skymvc支持多文件上传_php技巧

 本文实例为大家分享了skymvc实现文件上传的具体代码,供大家参考,具体内容如下 1.代码upload.ctrl.php     <?php class uploadControl extends skymvc{ public function __construct(){ parent::__construct(); } public function onDefault(){ $this->smarty->display("upload/default.html"

JSPSmart实现文件上传时file和text表单同时提交的问题

js|上传|问题 原来这世界,就是一个圆.自始至终我都在圆圈里运动,从起点到起点,从终点到终点.在网上搜了无数的资料,为了寻找text表单和file文件一起提交的方法,累的脑袋直响.最后回到了开始的地方.找到了那条,曾经被我忽略的代码.原来,它可以这样简单. 好吧,我直切正题,下面的例子中有从网上哪位前辈写的内容,我只是稍加改动,写本文没有商业目的,前辈原谅我没引入你的大名啊. 程序有一个提交页面,其实用html就好了,不过原代码用的是jsp我也拿来用吧. selectfile.jsp---->

基于.net mvc的校友录 四、系统结构图

这是整个系统结构的预览,话不多说,给个图: 本网站努力为每个人提供一个有效的校友录系统,为参与者提供一个简单有效的交流互动的平台,操作上要求简单.高效,性能上要求稳定.可扩展.在对同类网站系统进行了调查之后,通过重新设计,为网站使用者提供了如下的功能操作:管理员可以管理用户.用户可以搜索班级加入班级,进入班级后可以创建相册上传照片,可以留言发表评论,可以查看别人的通讯录发送小纸条,对于自己的上传的照片.相册可以进行删除操作,也可以退出班级,也可以删除自己的留言. 为了满足上面提出的功能需求,本网

基于.net mvc的校友录 三、实体模型实现

由于是实际开发,而且是时间比较紧的,所以,在开发实现过程中,总有一些对原计划的改动: AlumniBookModel数据库实体模型 这是主数据实体类,EF会根据此实体生成数据库,它的每一个成员都是DbSet类型,这是数据集类型,也就是内存中的表,数据库AlumniBookModel中共有九张表,它们的名字分别是成员的名字,但是,若是打开数据库,就会发现,它们的表名是这些成员名的复数,而这个机制,开篇已经有讲过,这里不再多说.再来看一下它的构造函数: public class AlumniBook

基于.net mvc的校友录五 web.config对的配置以及filter实现的权限控制

web.config配置文件 此文件是整个系统的配置中心,它告诉iis服务器本网站需要哪些运行时环境,需要哪些环境,将要进行哪些操作,开发人员也会将一个常量性的数据放在此配置中,以备系统全局调用.此文件内容丰富,对于一些普适性的项目,不作说明,只针对本系统的配置作相应说明. web.config配置文件 web.config是xml格式的文件,它是一种结构性文档,可以通过结点对数据进行遍历.第一行<?xml version="1.0" encoding="utf-8&q

基于.net mvc的校友录 开篇

这系列的博客是作为我做毕业设计的记录来弄的.因为现在的工作是嵌入式,所以,而.net在学校没有学过,更别说mvc或者是EF的codefirst了,所以,都是自学来了,都是一家之解,有不当之处,大家多提宝贵议见. 园子里的兄弟们,我这是记录而不是教程哦,请和我一样的新手看到我的文章后斟酌而行,万不可随意模仿. 好了,下面我们开始. 使用的技术: 这是毕业设计,多数人都是买来的或者是改来的,因为一个人做一个大型的网站,还是我们这样的二本底下的学校,加上还要上班,时间非常少.但是,我想做的一个原因是微

基于.net mvc的校友录 六、codefirst的使用以及班级模块的关键部分实现

通过EF将新用户存入数据库 这里,探讨一下如何使用EF的code first将数据存入数据库,以及如何对用户的密码进行md5加密与验证.下面是用户登陆的前台代码. @using (Html.BeginForm("ToLogin", "Log")) {    @Html.AntiForgeryToken()    @Html.ValidationSummary(true) <div> <div>    <section id="

基于.net mvc的校友录 二、实体模型设计

前言 已经回学校好多天了,同学们也陆陆续续地来了,多数人已经拿到了自己的毕业设计了,我看着自己的一堆设计资料,却还没有多少东西能给人看的,心里是一阵阵的焦急啊.不过,咱是后期,就老老实实地慢慢farm,总会完成的.这段时间,我把我所能用到的功能(包括权限控制.登陆检测.保存密码等等)在.net mvc4中的实现找了一遍,并且都测试了一遍,怕的是以后做的过程中被卡,就难受了,先探路,后过兵.虽然过程是痛苦的,中间包括cookies在controller中的删除,最是令人心烦,再加上filter在中

基于.net mvc的校友录 一、前台需求设计

之前已经想过好多个版本,但是,最终定在这下面这个版本上面,因为我觉得实现起来前台的模块比较固定,浮动的元素也少,因为我是那种万事用div的DS,所以,对于绝对定位相对定位,父定位,一向很DT,这种类metro的风格很方便我来实现前台,而且好看,即使不好看,也可以跟老师说,我这是为响应新元素新风格--metro!(所说不叫这名字了,这货被告了). 好了,下面进入正题,因为这是我昨天晚上加今天空余时间做的东西,多数是设计,刚刚用一会儿时间才做成图片,给供大家评指.所以,大家看的时候,用手机的同学注意