ASP.NET MVC5 开发小结

Preface

对JS产生的极大兴趣之后,就没怎么碰过.Net了。然而这几天突然接到一个需要后台的项目,为了快速开发,还是老老实实回到.Net的怀抱。
电脑上的VS还是2013 Community,能支持最新的框架是MVC5,然而我以前只要MVC4的开发经验,不过随便了解一下感觉挺不错的,特别是默认的View还集成了Bootstrap。

MVC5 vs MVC4

  1. 新的用户管理Identity代替了以前的MembershipSimpleMembership——MVC5中非常棒的更新,不可扩展可以说后两者的硬伤了,以前为了给用户新加一个字段google不少资料,请教了不少人,现在Identity可以直接支持在Model里面自定义字段,方便快捷。官方介绍
  2. 现成的数据库上下文——一个比较小改进吧,在IdentityModel中,继承自IdentityDbContext
  3. 默认bundle了Bootstrap,虽然前端我喜欢自己手写页面。但是为了快速开发,还是使用现成框架比较省事。( 然而项目最终并没有用到。
  4. 新增了许多异步方法,形式看起来比较像es7的async function。但是还是提供了相对应的同步方法。没有深入了解两者的差异。

Tutorials

直接上链接。大部分规律是,E文有干货,中文天下一大抄。

  1. http://typecastexception.com/post/2014/04/20/ASPNET-MVC-and-Identity-20-Understanding-the-Basics.aspx (非常不错的入门文章,非常推荐)
  2. http://typecastexception.com/post/2014/06/22/ASPNET-Identity-20-Customizing-Users-and-Roles.aspx#Extending-Identity-Role
  3. http://blogs.msdn.com/b/webdev/archive/2013/10/16/customizing-profile-information-in-asp-net-identity-in-vs-2013-templates.aspx
  4. https://msdn.microsoft.com/en-us/data/jj591621 (数据库迁徙)
  5. http://www.cnblogs.com/chonghanyu/p/4090631.html (Identity.Samples的中文翻译)
  6. http://www.asp.net/identity/overview/features-api/account-confirmation-and-password-recovery-with-aspnet-identity#build
  7. http://www.asp.net/identity/overview/getting-started/aspnet-identity-recommended-resources

推荐博客:http://typecastexception.com/

Notes

一对多、多对多关系更新复杂属性

1
2
3
4
5
6
7
8
var p = new Person();
db.People.Attach(p); // Attach person first so that changes are tracked
db.Entry(p).Reference(e => e.EmployeeType).Load();//one to many
db.Entry(p).Collection(e=>e.Favors).Load();//many to many
p.EmployeeType = e;
p.Favors = new List<Favor>();
db.Entry(p).State = EntityState.Modified;
db.SaveChanges();

reference: http://stackoverflow.com/questions/5506116/entity-framework-code-first-why-cant-i-update-complex-properties-this-way

通过User实体获取当前用户的Id

1
2
using Microsoft.AspNet.Identity;
User.Identity.GetUserId();

或者

1
HttpContext.Current.User.Identity.GetUserId();

reference: http://stackoverflow.com/questions/18448637/how-to-get-current-user-and-how-to-use-user-class-in-mvc5

服务器在数据库初始化阶段时无响应

初始化数据库时不能使用

1
db = new ApplicationDbContext();

而应该使用下面方法代替

1
db = System.Web.HttpContext.Current.GetOwinContext().Get<ApplicationDbContext>();

SigninManager同理
reference: http://stackoverflow.com/questions/25296059/asp-net-mvc-5-page-hangs-on-db-call

form无法提交class为disable的表单项

使用readonly = "readonly"
reference: http://stackoverflow.com/questions/2700696/how-do-i-submit-disabled-input-in-asp-net-mvc

Bootstrap Tooltip 失效

因为Bootstrap Tooltip与JqueryUI冲突。
reference: http://stackoverflow.com/questions/20859964/tooltip-not-working-bootstrap

限制上传文件类型

1
<input type="file" multiple accept='image/*|audio/*|video/*' >

或者

1
2
var files=e.target.files;
var mimeType=files[0].type; // You can get the mime type

reference: http://stackoverflow.com/questions/1561847/html-how-to-limit-file-upload-to-be-only-images

上传图片预览

1
2
3
4
5
6
7
8
$('#img').change(function(){
var file = this.files[0]; //选择上传的文件
var r = new FileReader();
r.readAsDataURL(file); //Base64
$(r).load(function(){
$('div').html('<img src="'+ this.result +'" alt="" />');
});
});

reference: http://gongwen.sinaapp.com/article-302.html

Linq To Entities的两种写法

1
2
var HotJobs = db.Jobs.Where(c=>c.IsDelete == false)
.OrderByDescending(c=>db.Resumes.Where(m=>m.Status!=ResumeStatus.deleted&&m.Job==c).Count()).ToList();

vs

1
2
3
var HotJobs = db.Resumes.Include(m=>m.Job)
.Where(m=>m.Status!=ResumeStatus.deleted&&m.Job.IsDeleted==false)
.GroupBy(m=>m.Job).OrderByDescending(m=>m.Count()).Select(m=>m.Key).ToList();