基于.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;
首先是从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掉。这虽不是最原始的解决方法,但是,却是一种思想,复杂的数据库查询,放到内存中进行集合处理,这样直观而且不容易出错。
转载请标注原地址:http://www.cnblogs.com/ensleep/tag/%E5%9F%BA%E4%BA%8E.net%20mvc%E7%9A%84%E6%A0%A1%E5%8F%8B%E5%BD%95/
基于.net mvc的校友录(七、文件上传以及多对多关系表的LINQ查询实现)的更多相关文章
- MVC&WebForm对照学习:文件上传(以图片为例)
原文 http://www.tuicool.com/articles/myM7fe 主题 HTMLMVC模式Asp.net 博客园::首页:: :: :: ::管理 5 Posts :: 0 ...
- Spring 4 官方文档学习(十一)Web MVC 框架之multipart(文件上传)支持
http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-multipart 1.简 ...
- 基于HT for Web矢量实现HTML5文件上传进度条
在HTML中,在文件上传的过程中,很多情况都是没有任何的提示,这在体验上很不好,用户都不知道到时有没有在上传.上传成功了没有,所以今天给大家介绍的内容是通过HT for Web矢量来实现HTML5文件 ...
- Spring MVC使用commons fileupload实现文件上传功能
通过Maven建立Spring MVC项目,引入了Spring相关jar依赖. 1.为了使用commons fileupload组件,需要在pom.xml中添加依赖: <properties&g ...
- 自定义MVC框架之工具类-文件上传类
截止目前已经改造了3个类: ubuntu:通过封装验证码类库一步步安装php的gd扩展 自定义MVC框架之工具类-分页类的封装 该文件上传类功能如下: 1,允许定制上传的文件类型,文件mime信息,文 ...
- 头像文件上传 方法一:from表单 方法二:ajax
方法一:from表单 html 设置form表单,内包含头像预览div,内包含上传文件input 设置iframe用来调用函数传参路径 <!--表单提交成功后不跳转处理页面,而是将处理数据返回给 ...
- 基于.net mvc的校友录(四、系统结构图)
这是整个系统结构的预览,话不多说,给个图: 本网站努力为每个人提供一个有效的校友录系统,为参与者提供一个简单有效的交流互动的平台,操作上要求简单.高效,性能上要求稳定.可扩展.在对同类网站系统进行了调 ...
- 基于.net mvc的校友录(六、codefirst的使用以及班级模块的关键部分实现)
通过EF将新用户存入数据库 这里,探讨一下如何使用EF的code first将数据存入数据库,以及如何对用户的密码进行md5加密与验证.下面是用户登陆的前台代码. @using (Html.Begin ...
- 基于.net mvc的校友录(五、web.config对的配置以及filter实现的权限控制)
web.config配置文件 此文件是整个系统的配置中心,它告诉iis服务器本网站需要哪些运行时环境,需要哪些环境,将要进行哪些操作,开发人员也会将一个常量性的数据放在此配置中,以备系统全局调用.此文 ...
随机推荐
- npm命令大全
参考网站:https://docs.npmjs.com/ 有了npm,可以很快的找到特定服务要使用的包,进行下载.安装以及管理已经安装的包. npm 常用命令 npm install <name ...
- Android Malware Analysis
A friend of mine asked me help him to examine his Android 5.0 smartphone. He did not say what's wron ...
- poj3020
define n the number of ' * ' define d the number of couple of two points define s ...
- Promise机制
Promise的诞生与Javascript中异步编程息息相关,js中异步编程主要指的是setTimout/setInterval.DOM事件机制.ajax,通过传入回调函数实现控制反转.异步编程为js ...
- PHP出错界面详细说明
在web 上所有常见的错误之一就是无效的链接.一旦从其它站点上出现了无效的链接,你会重新安排你 的站点.人们会将他们喜欢的站点存成书签,如果在三个月后再次访问时,仅仅发现的是'404 Not Foun ...
- Android中SearchView修改字体颜色
首先获取searchView控件,比如在actionbar上获取: SearchView searchView = (SearchView) menu.findItem(R.id.action_sea ...
- CentOS 6.x版本升级Mysql
首先确定一下自己的DNS vi /etc/resolv.conf 我一般为114.114.114.114 #-----------------------------CentOS 6.x版本升 ...
- Ajax的get请求向服务器请求数据五步骤?
如下: ①创建ajax对象 ②建立http请求 ③发送http请求 ④设置ajax对象状态改变的回调函数 ⑤判断ajax状态是否等于4,做相应的业务逻辑
- JDK 环境变量的配置
小编下载的是 jdk1.6 的版本 具体如何如何安装我相信大家肯定都会的了 这里就不做详细的说明了 , 我的jdk 安装的目录是在 D:\javac 这个目录下 下面我们来配置环境变量 在我的电脑- ...
- Android消息推送完美方案[转]
转自 Android消息推送完美方案 推送功能在手机应用开发中越来越重要,已经成为手机开发的必须.在Android应用开发中,由于众所周知的原因,Android消息推送我们不得不大费周折.本文就是用来 ...