MVC5

* 重点

1. TempData、ViewData、ViewBag

https://msdn.microsoft.com/en-us/library/bz9tc508.aspx
区别如下:
  TempData:TempDataDictionary的一个实体,保存在Session中,也是以键值对的结构存在。
  ViewData:ViewDataDictionary的一个实体,以键值对的结构存在。
  ViewBag:dynamic([daɪ'næmɪk])动态类型,能够动态解析
 
如下代码:
string[] items = new string[] { "one", "two", "three" };
ViewBag.Items = items;
ViewData["Items"] = items;
由调试可以发现:

ViewBag中用的是dynamic类型,因此可以自动根据数据类型转换。
复制代码
<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>
复制代码
 
如下,有两个Action方法:
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。

 
通过上面几个简单的例子,我们可以从生命周期来看:
(1).ViewData和ViewBag的生命周期和View相同,只能在当前View中使用。当本次请求结束后,就会自动清空值。
(2).TempData则可以在不同的Action中进行传值,类似Webform中的Session,TempData的值在取了一次后则会自动删除
  TempData的特性就是可以在两个Action之间传递数据,它会保存一份数据到下一个Action,并随着再下一个Action的到来而失效。所以它被用在两个Action之间来保存数据。比如,这样一个场景,你的一个Action接受一些post的数据,然后交给另一个Action来处理,并显示到页面,这时就可以使用TempData来传递这份数据。 

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();
        }
View Code

  前台:

@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,只是调用的方法*@
View Code

* 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开发的授权标准。

 

 

 

 

 

 

 

 

 

 

 

 

 

  

 

posted on 2018-04-28 09:41  莫伊筱筱  阅读(202)  评论(0)    收藏  举报