MVC5
* 重点

1. TempData、ViewData、ViewBag
string[] items = new string[] { "one", "two", "three" };
ViewBag.Items = items;
ViewData["Items"] = items;

<ul>
@foreach (dynamic p in ViewBag.Items)
{
<li>The item is: @p</li>
}
</ul>
而ViewData中用的是object对象,要自己去强制转换类型才可以遍历使用。
<ul>
@foreach (string a in (string[])ViewData["Items"])
{
<li>The item is: @a</li>
}
</ul>
public ActionResult Index()
{
this.TempData["Name"] = "Julian";
return View();
}
public ActionResult Index2()
{
string name = this.TempData["Name"] as string;
return View();
}
Index()中,给TempData添加了一个键值对。假设请求了这个Action后,接着请求Index2这个Action。则可以在Index2中,获取到TempData的键值对的信息。
有趣的是,如果再一次请求Index2,那么从TempData中读取到的Name的值为Null。
2. cshtml页面
只要是@后面都是C#代码
3.Partial和Action
3.1 Html.Partial
1.不要使用Controller,由于没有Controller,View只能在相同目录或Shared目录中,要不无法调用
2.有返回值MvcHtmlString,所以可以把返回值保存在变量中
主要适用于: 没有model数据,或model数据由调用时给定的情况,其实很像一个格式化辅助方法,你把数据给他,他返回你格式化的数据
3.2 Html.ReaderPartial
1.与Html.Partial一样,不要使用Controller
2.没有返回值,他是直接把PartialView的数据写与当前Page对象的TextWriter中,所以可能使用当前页Controller的model数据
主要适用于:数据model在每个使用他的Page的Controller中
3.3 Html.Action
1.与Html.Partial一样,返回MvcHtmlString对象,可以保存在变量中
2.但必须有Controller,这样PartialView不一定要在同级或Shared中,可以在Controller的方法上加上ChildActionOnly标签,防止直接浏览页面
3.4 Html.ReaderAction
1.与Html.ReaderPartial一样,是没有返回值,直接把数据写入当前页的TextWriter中
2..必须有Controller,这样PartialView不一定要在同级或Shared中,可以在Controller的方法上加上ChildActionOnly标签,防止直接浏览页面
1 <!--partial和action的区别: 2 1、partial没有用到控制器,直接把View(Page)加进来,用到的数据是来自View本身; 3 2、action 会用到Controller之后再回传一个页面,会发起一个新的Request; 4 相同点: 5 被用来显示一个功能相对独立的“块”,比如菜单、导航栏。输出的结果都被作为调用的view的一部分显示。 6 --> 7 <!--将部分视图渲染为字符串Object(MvcHtmlString),不需要路径和扩展名--> 8 @Html.Partial("_LoginPartial") <!--在这里添加登录内容--> 9 <!--在主页面上添加指定的view,将分布视图直接写入响应输出流;所以必须放在代码块中,不能放在表达式中(返回值是void),性能好些--> 10 @{ Html.RenderPartial("_LoginPartial");} 11 12 <!-- 1、Action中使用return PartialView()指定分部视图,在_ViewStatrt.cshtml中指定的Layout会无效。 13 2、在在Action中可以通过IsChildAction来判断是被Url直接调用还是被Action()/RenderAction()调用,在 14 Action上写[ChildActionOnly]防止直接调用--> 15 @*@Html.Action("") 16 @{Html.RenderAction("");}*@
4. 传DataTable
后台:
public ActionResult Index() { var dt = SqlHelper.ExecuteDataTable("select * from bookinfo", null); if(dt.Rows.Count > 0) { //两种循环DataTable的方式 foreach(var item in dt.Rows) { var c1 = ((DataRow)item).ItemArray[2]; } } //注意ViewBag,仅在对应的视图之间传值,此处对应Index视图 ViewBag.dt = dt; return View(); }
前台:
@using System.Data; @helper viewTest() { var dt = ViewBag.dt as DataTable; if(dt.Rows.Count > 0) { for(var i=0; i< dt.Rows.Count; i++) { @Html.Raw(dt.Rows[i][2]) } } } @viewTest() @*在页面中直接调用,不是function,只是调用的方法*@
* MVC5 验证
1. Authorize特性
- ASP.NET WebForms提供了很多自动保护机制来保护页面不受恶意用户的攻击;
- ASP.NET MVC 的安全机制需要程序员自己去写
Authorize:
是ASP.NET MVC自带的默认授权过滤器,不带任何参数,只要求用户以某种角色登录网址才可访问,即禁止匿名访问。
[Authorize]特性可以用在控制器类上,也可以用在控制器中方法上,还可以添加全局过滤器App_Start\FilterConfig.cs文件中:【全局过滤器只针对MVC控制器操】
public class FilterConfig { public static void RegisterGlobalFilters(GlobalFilterCollection filters) { //全局Authorize过滤,整个应用程序必须授权才能访问。弊端:就连注册登录都不能访问, 解决方法:在登录,注册的控制器上添加[AllowAnonymous]运行匿名访问 filters.Add(new System.Web.Mvc.AuthorizeAttribute()); filters.Add(new HandleErrorAttribute()); } }
1.1 AllowAnonymous特性
- 运行用户匿名访问,但是只针对表中的AuthorizeAtrribute有效,对自定义的授权过滤器则无效。
1.2 角色成员使用Authorize特性
可以同时给多个角色和用户授权:【应该用角色来管理权限】
[Authorize(Roles ="Administrator, SuperAdmin", Users ="Jon, Phil, Brad")] public class LearningController : Controller
2. OAuth和OpenID的外部登录
- 网站注册麻烦,因此用OAuth和OpenID开发的授权标准。

浙公网安备 33010602011771号