一、遗留问题
1、SaveChanges()不报错:查了些资料,没找到什么,但加了Try/Catch是可以的
2、Linq插入默认值:也有很多人有同样困惑,都只有变通方法。一种是改成可空,一种是显式传入默认值
3、查插入默认值资料时,发现好像目前这个叫LinqToSql?和EF还不是一回事?由于基础知识欠缺,只好暂存疑惑,先往下走。
二、登陆
1、Form提交表单
源码就一句Html.BeginForm(),就是提交给自身。Controller里面有两个Login,一个是返回页面的View,一个是认证。头部加上[HttpPost],以便接收Post信息(不会接收Get)
[AuthorizeIgnore] public ActionResult Login() { return View(); }
[HttpPost] [AuthorizeIgnore] public ActionResult Login(string username, string password, string verifycode) { if (!VerifyCodeHelper.CheckVerifyCode(verifycode, this.CookieContext.VerifyCodeGuid)) { ModelState.AddModelError("error", "验证码错误"); return View(); } var loginInfo = this.AccountService.Login(username, password); if (loginInfo != null) { this.CookieContext.UserToken = loginInfo.LoginToken; this.CookieContext.UserName = loginInfo.LoginName; this.CookieContext.UserId = loginInfo.UserID; return RedirectToAction("Index"); } else { ModelState.AddModelError("error", "用户名或密码错误"); return View(); } }
2、改造
直接复制过去一大堆红字,显然是不能直接用的。看源码的步骤有几个:检查验证码 -> 检查登陆用户名密码 -> 存进cookie并跳转Index
错误提示:
ModelState.AddModelError("error", "验证码错误");
<div>@Html.ValidationMessage("error") </div>
原来在Controller里面使用ModelState.AddModelError,会对应到页面上相应的错误提示。并生成
<span class="field-validation-error" data-valmsg-for="error" data-valmsg-replace="true">验证码错误</span>
.field-validation-error这个是错误提示默认类,可以自定义样式,也可以直接用bootstrap的help-block类
<span class="help-block">@Html.ValidationMessage("error")</span>
发现登陆时还会带个权限过去,以判断显示哪些菜单,先跳过吧。。。
源码用了EntityFramework.Extend,不知是否版本原因,.Delete()方法报错
折腾了一两小时学习EF。。。发现还是版本问题,要用nuget来重新弄个最新版的就可以,好歹现在可以正常用Delete()方法了
对于EF,实在是搞不懂。好像各个版本连语法都能不一样?网上搜了些EF的写法,项目里死活点不出来,什么DeleteObject,压根没有?
EF到底要怎么用啊。。。
===============================
历尽千辛万苦,终于登陆成功了,验证用户名密码正确后,跳转到了Index页。。。
有几点收获
1、EntityFramework不用using EntityFramework,引入DLL就算可以了(或用NuGet管理比较方便),要注意和Extend版本一致
2、表单元素基本写法:@Html.TextBox("username",string.Empty,new {@class = "form-control",placeholder = "用户名"})
3、各版本EntityFramework好像差别很大,连语法都不同?而且好像还有LinqToSql和LinqToEF的区别,搞的人全晕了,对初学者很不友好。。。
4、学习了验证码的校验流程(临时存取Cookie或Session、数据库)
5、学习了登陆时验证、加解密、存取机制
6、加深了封装的理解。应该先封装一些和项目无关的公共方法(如存取cookie、上传下载等),再封装一些项目中通用的方法(目前是杂在一块了),再指定BLL去调用方法。
7、类型转换封装,以前在项目中,常用到ToString()或Convert.ToInt32()之类,字符串还好些,可以用Convert.ToString(),数字或时间的,时不时就因为数据有问题而报错。看了这份源码后学会了应该封装成ToInt()、ToDateTime()方法,使用Int.Parse()之类的进行解析,转换失败就返回默认值,避免每次都要去判断。
8、好像MVC没有BLL?目前是新建相应类放在Modal层里(如AccountBLL.cs),或是要另建BLL层?好像和3层概念不大一样,目前觉得放在Modal层里比较说的通。
9、Modal层目前是用ADO.NET实体模型,在网上看了一些源码,好像不大一样,除了基本的表结构映射,还有些其它功能。。。不知是手写的还是什么工具生成的,和ADO.NET实体模型生成出来的有所不同,至少没那个模型图。(目前公司用自定义T4模板来映射数据库到实体,感觉也是不错的选择)