MVC高级编程第四版小记
1 捆绑系统可以使得脚本库不绑定到具体版本号,实现自动更新。
bundles.Add(new ScriptBundle("~/bundles/jquery").Include( "~/Scripts/jquery-{version}.js")); @Scripts.Render("~/bundles/jquery")
2 HTML编码的用户输入 防止XSS 脚本攻击
public string Browse(string genre) { string message= HttpUtility.HtmlEncode("Genre= "+genre); return message;//利用方法HttpUtility.HtmlEncode来预处理用户输入的值 }
3 MVC 根据默认路由{controller}/{action}/{id} 带有名为id的参数 不用加查询字符串参数也可以传参
//Get:/Store/Details/5 public string Details(int id) { string message="ID= "+id; return message; }
4 视图本身不会被直接访问,浏览器不能直接指向一个试图渲染它。相反,视图总是被控制器渲染,因为控制器为它提供渲染的数据。
5 ViewBag和ViewData ViewBag.Message属性传值 ViewData使用字典方式传值 ViewBag是ViewData的动态封装器 但二者语法不存在技术的差异 只是Message属性方式更被人们所接受。
二者仍有关键差异。第一点,只有当要访问的关键字是一个有效的c#标识符,ViewBag才起作用。例如如果关键字View[" Bag"]带有空格或者特殊字符ViewBag就无法起作用,编译不会通过。
第二点,动态值不能作为参数传递给扩展方法@Html.TextBox("name",ViewBag.Name) 这里就是动态的,要么使用ViewData 要么string(ViewBag.Name)变成具体类型。
6 View中 强类型视图
Controller public ActoinResult List(){ var albums=new List<Album>(); for (int i=0;i<10;i++) { albums.Add(new Album{title=“Album”+i}); } return View(albums); } View 1.使用完全限定类型 @model IEnumerable<MVCDemo.Models.Album> 2.@using 声明 @using MVCDemo.Models
7 Model来进行数据传输 ViewBag用于显示主模型无关的数据
8 对于Razor只需要知道在插入代码时,输入Html和@符号
9 Razor可以智能的识别电子邮件的地址 @符合可以通过@@转义一个@进行打印 Razor可以使用圆括号()支持显示显式表达式 For Ex: Ex是个字符串 要打印Ex.models 如果写@Ex.models会被识别打印Ex的属性,这时候加上@(Ex).models即可。
10 Razor定义字符串 代码块
@{ string name=“Jack” }
11 Razor表达式是用HTML自动编码的。要想显示Html,使用@Html.Raw() 。 Html自动编码有效缓和XSS但是仍有存在JS中输入的风险,对JS中输入的值需要进行
JavaScript字符串编码即@Ajax.JavaScriptStringEncode方法。如此就有效避免了XSS攻击。可以理解为对Html和JS进行编码防止攻击。
12 @RenderBody占位符 标记使用这个布局的视图将渲染它们的主要内容的位置
13 ViewStart 这个代码比任何视图先运行,统一配置布局页面。每个视图可以重写Layout属性的默认值。
14 EF中的DbSet<T> 每一个T代表想要持久保存的对象。
15 MVC模型绑定 简而言之 MVC尽可能,最大努力的的使用模型绑定器去查找和绑定所有的属性 路由数据 查询字符串 表单集合
16 检查模型是否绑定成功 ModelState.IsValid 模型中还可以进行校验
17 表单是包含输入元素的容器。action特性告知Web浏览器信息发往哪里,action就包含了一个URL。 method特性则告知浏览器是使用HTTP POST还是HTTP GET方法,默认使用POST提交。可以将路由写在action完成提交。
18 Html辅助方法常用 @Html.BeginForm() @Html.TextBox() @Html.TextArea() @Html.Label() @Html.DropDownList() 等等
19 Html.ActionLink 和Html.Route Link渲染一个超链接
@Html.ActionLink("Link Text","AnotherAction")//控制器相同 @Html.ActionLink("Link Text","Index","OtherController")//另一个控制器 @Html.RouteLink("Linek Text",new {action="AnotherActoin"})//与ActoinLink不同 RouteLink只可以接受路由名称。
20 验证注解
常用的一些特性 必须[Required] 控制长度[StringLength(10,MinimumLength=3)] 正则表达式[RegularExpresson] 数值类型范围[Range(10,20)] 确保相同值[Compare("Email")] 每个特性可以添加ErrorMessage
21 显示和编辑注解
设置友好的显示名称[Display(Name="First Name")] 设置信息用途[Display(Name="Password")]
22 要求SSL登录 SSL(Secure Sockets Layer 安全套接层) SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持 防止信息拦截 使用Https 特性[RequiredHttps]
23 Html.AntiForgeryToken辅助方法 配合特性[ValidateAntiforgeryToken] 阻止CSRF跨站请求伪造
24 使用HttpOnly阻止cookie盗窃 在web.config中设置<httpCookies domain="" httponlyCookies="true" requireSSL="false"> 或者对单个Cookie进行设置 属性HttpOnly=true Cookie不能跨不同的域名
这个标记告诉浏览器除了服务器修改或设置cookie之外,其他操作均无效。
25 重复提交威胁 恶意者添加不是表单数据中的字段进行攻击 使用特性[Bind] Ex:[Bind(Include="Name")] 使用白名单指定允许绑定的字段
26 开放重定向攻击 篡改URL定向都恶意的URL 使用RedirectToLocal函数防御 将Redirect(url)重定向方法变为RedirectToLocal(url) 该方法自写,最重要的是Url.IsLocalUrl进行验证
private Actoin RedirectToLoacl(string returnUrl){ if(Url.IsLocalUrl(returnUrl)) {//(Url.IsLocalUrl参数验证 return Redirect(returnUrl); } else { return RedirectToActoin("Index","Home"); } }
27 统一资源定位符URL 高质量:便于记忆和拼写且简短便于输入可反映站点结构等
28 路由 将URL映射到对应的Action
29 FormsAuthentication.SetAuthCookie(login.UserName, false); 此法记录身份票据并存储到Cookie 之后可用 特性[Authorize]过滤授权 特性[AllowAnonymous]允许匿名访问
30 过滤器专用于MVC 常用的就是授权和Https场景 种类分为 授权 资源 Acton 异常 Result
资源过滤器根据用户请求的地址,查找对应的缓存,如果找到缓存,则返回结果 ,如果没找到就添加执行动作。
Acton和Result过滤分别是指执行前和执行后进行过滤的
异常过滤器:当项目中出现异常时,就会自动执行异常过滤器中的代码。先添加一个类。
31 MVC的内容大概就这么多基础 关于角色管理部分 是MVC结合Identity 根据不同的用户进行用户的管理和角色的管理。