EF+MVC+Bootstrap 项目实践 Day5

一、遗留问题

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模板来映射数据库到实体,感觉也是不错的选择)

原文地址:https://www.cnblogs.com/liuyouying/p/5043999.html