图片的上传与调用

图片的上传就是文件的上传,在前台使用的是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查询实现)的更多相关文章

  1. MVC&WebForm对照学习:文件上传(以图片为例)

    原文  http://www.tuicool.com/articles/myM7fe 主题 HTMLMVC模式Asp.net 博客园::首页::  ::  ::  ::管理 5 Posts :: 0 ...

  2. Spring 4 官方文档学习(十一)Web MVC 框架之multipart(文件上传)支持

    http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-multipart 1.简 ...

  3. 基于HT for Web矢量实现HTML5文件上传进度条

    在HTML中,在文件上传的过程中,很多情况都是没有任何的提示,这在体验上很不好,用户都不知道到时有没有在上传.上传成功了没有,所以今天给大家介绍的内容是通过HT for Web矢量来实现HTML5文件 ...

  4. Spring MVC使用commons fileupload实现文件上传功能

    通过Maven建立Spring MVC项目,引入了Spring相关jar依赖. 1.为了使用commons fileupload组件,需要在pom.xml中添加依赖: <properties&g ...

  5. 自定义MVC框架之工具类-文件上传类

    截止目前已经改造了3个类: ubuntu:通过封装验证码类库一步步安装php的gd扩展 自定义MVC框架之工具类-分页类的封装 该文件上传类功能如下: 1,允许定制上传的文件类型,文件mime信息,文 ...

  6. 头像文件上传 方法一:from表单 方法二:ajax

    方法一:from表单 html 设置form表单,内包含头像预览div,内包含上传文件input 设置iframe用来调用函数传参路径 <!--表单提交成功后不跳转处理页面,而是将处理数据返回给 ...

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

    这是整个系统结构的预览,话不多说,给个图: 本网站努力为每个人提供一个有效的校友录系统,为参与者提供一个简单有效的交流互动的平台,操作上要求简单.高效,性能上要求稳定.可扩展.在对同类网站系统进行了调 ...

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

    通过EF将新用户存入数据库 这里,探讨一下如何使用EF的code first将数据存入数据库,以及如何对用户的密码进行md5加密与验证.下面是用户登陆的前台代码. @using (Html.Begin ...

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

    web.config配置文件 此文件是整个系统的配置中心,它告诉iis服务器本网站需要哪些运行时环境,需要哪些环境,将要进行哪些操作,开发人员也会将一个常量性的数据放在此配置中,以备系统全局调用.此文 ...

随机推荐

  1. Java移位运算

    java中移位运算符有三种“<<”.“>>”.“>>>”,没有“<<<”运算符. “<<”运算符将二进制位进行左移,低位用0来填 ...

  2. 开篇 hello 内Cool超人

    经过一年时间看到asp.net mvc一直被受微软开发团队的注重.与之相比的silverlight我感觉到有点力不从心.除去silverlight第一次运行要安装Runtime不说,产品不可能只运行在 ...

  3. 打开新窗口(window.open) 用法

    窗口名称:可选参数,被打开窗口的名称. 1.该名称由字母.数字和下划线字符组成. 2."_top"."_blank"."_selft"具有特 ...

  4. Nginx配置:http重定向,URLRewrite,一个简单框架的配置思路

    一个重定向的应用配置: server { listen       8000; server_name  localhost; root F:/home/projects/test; index   ...

  5. JSP标记

    JSP标记是JSP页面中很重要的组成部分,JSP标记包括指令标记.动作标记和自定义标记.其中自定义标记主要讲述与Tag文件有关的Tag标记. 一 指令标记page Page指令标记,简称page指令, ...

  6. Windows 8.1激活问题

    今天电脑开机,莫名的出现“你的Windows证书即将过期”. 系统本来用HEU_KMS_Activator 已激活成功,但查看系统激活状态时,结果如下图所示: 显示系统是已激活成功的.但还是有提示说系 ...

  7. 关于垃圾回收(GC和Marshal)有感

    最近做一个挂机软件.要求是挂个三四天没事,不会报错.开始的时候都是顺利的,所有步骤都是可以ok.但是当测试运行的是就出现问题了,内存居然会在一个Task跑完之后暴涨几M的内存.开了一台测试机测试了一天 ...

  8. 用O(1)的时间复杂度,找到栈和队列中的最小(大)值

    最近刷剑指offer,看到两道编程题,考察在O(1)的复杂度内,找出最值. 觉得很有意思,很有借鉴意义,故记录在此. 需要注意的是,这里所说的O(1) 有个前提, 就是已经通过某种容器的存储方式进行初 ...

  9. Perl 随机数和随机密码的产生

    Perl有着强大的随机数产生函数rand(),下面的代码详细介绍其应用 #!/usr/bin/perl #  use strict;   use warnings; # 0~1之间    $rando ...

  10. ubuntu miss tool bar

    reson: unity exception 1. open terminal:  /usr/bin/**terminal** 2. run command on terminal: gsetting ...