基于.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服务器本网站需要哪些运行时环境,需要哪些环境,将要进行哪些操作,开发人员也会将一个常量性的数据放在此配置中,以备系统全局调用.此文 ...
随机推荐
- dig out deledted chat messages
One of my friends asked me to do a favor for her. She said her friend deleted some important chat me ...
- leetcode 7
此题实现比较简单,但是边界处理比较麻烦.题目要求是以32位考虑,所以可表达的数的范围是-2147483648~2147483648. 我们需要判断当前的数翻转之后是否在这个范围中,我的思路是首先对当前 ...
- 遇到困难 jsp代码onclick="javascript:return(checklogin());"报错
<script language="javascript"> function checklogin() { if (document.getElementById(& ...
- Linux搭建NFS提供磁盘给Windows使用
在Windows2008系统下设置挂载Linux服务器磁盘 一.系统环境 系统平台:CentOS release 5.8 (Final) NFS Server IP:X....X...153.157 ...
- ASP测试代码: <% response.write("helloworld,vbscript!") %>
ASP测试代码: <% response.write("helloworld,vbscript!") %>
- 在Entity Framework 中执行T-sql语句
从Entity Framework 4开始在ObjectContext对象上提供了2个方法可以直接执行SQL语句:ExecuteStoreQuery<T> 和 ExecuteStoreC ...
- sqoop导出工具
sqoop的导出工具是把HDFS上文件中的数据导出到mysql中 mysql中的表 现在在linux上创建一个文件,并把这个文件上传到hdfs上 cat person.txt ,no7, ,no8, ...
- apache日志文件详解和实用分析命令
apache日志文件每条数据的请意义,以及一些实用日志分析命令. 一.日志分析 如果apache的安装时采用默认的配置,那么在/logs目录下就会生成两个文件,分别是access_log和error ...
- Android消息推送完美方案[转]
转自 Android消息推送完美方案 推送功能在手机应用开发中越来越重要,已经成为手机开发的必须.在Android应用开发中,由于众所周知的原因,Android消息推送我们不得不大费周折.本文就是用来 ...
- AMD平台下在Windows虚拟机中安装Mac10.8.6【Written By KillerLegend】
我的电脑CPU是AMD,以前在虚拟机中装过Windows操作系统,感觉很简单,这几天想体验一下苹果系统,未来也可能会从事Mac相关软件开发,于是从早上便兴致勃勃的开始了--于是悲剧也开始了,上网各种查 ...