MVC知识点

一·  MVC

 MVC设计模式->MVC框架(前端开发框架),asp.net(webform) aspx
 M:Model (模型,负责业务逻辑处理,比如说去db中获取数据)
 V:View (视图,负责展示页面元素给用户,Razor模板(.cshtml) 由Razor引擎读取.cshtml将里面的占位符根据Razor的语法结构一一替换成html代码)
 C:Controller (控制器,负责根据url请求路径,决定调用哪个action)
 
2、Razor引擎对应的页面扩展名为:.cshtml
 2.1、在.cshtml引用命名空间的指令为:@using
 2.2、cshtml页面本质上会被编译成一个前台页面类,继成WebViewPage<object> 类 (弱类型视图)
 2.3、强类型视图:
  1、在cshtml页面上使用指令@model 要转换的类型,就将当前cshtml视图变成了指定的强类型视图
  2、在当前视图所对应的action中要通过 View()方法传入对于的实体数据

3、MVC重要的特点:约定大于配置


 1约定
 控制器约定:

 1、控制器的后缀名一定是Controller结尾
 2、方法控制器下的方法会去查询其Views文件夹下的和控制器同名目录下的和action同名的视图
 3、控制器中的action方法一定是public,否则会抛出404异常

 


action向视图传值的方式:
 1、ViewData
 2、ViewBag
 3、TempData
 4、View() :通过Model传递给视图页面的 ,所以在.cshtml中是用Model来接收的
  注意点; ViewBag 本质上使用的是ViewData来传递的,所以ViewBag和ViewData存在相同key,那么后面那个的值会覆盖前面那个的值

二、传值
 在控制器的方法中接收url传值id的方式:
 1、Request.QueryString[]
 2、Request.Params[]
 3、通过路由规则参数 占位符
  约定:action方法中的形参 名称一定要和匹配路由规则的占位符{id}保持一致
 
三、可以在View()方法中由程序员指定要返回的视图名称
例如: return View("Index1");  //视图引擎一定是去和当前action所在控制器同名的文件夹中查找Index1.cshtml视图返回

、控制器重要约定
1、控制器类名称后面一定是要以Controller 结尾,父类必须继承Controller 
2、控制器中的actin所对应的视图页面,是存放在Views文件夹下和控制器同名的文件下
3、在action 中通过return view() :告诉视图引擎去当前Views文件夹下查找和action 方法同名的视图文件
4、return view("程序员可以自己指定视图名称")

5、路由:
 5.1、当MVC应用程序第一次启动的时候,就会执行Global.asax文件中的Application_Start()方法
 调用RouteConfig.RegisterRoutes()注册好程序员编写的路由规则
 5.2、路由规则的主要作用:1、mvc.net会根据路由规则中的url来解析 当前浏览器发出的请求路径中,哪段文本表示控制器
         哪段文本表示action  例如: /Home/Index

6  action方法的结构:
 1、action方法必须是public的方法,否则会出现找不到
 2、方法的返回类型可以是actionResult也可以是string,void等
 3、为什么return view()可以满足ActionResult的返回值要求呢? 是因为 View()本质是一个ViewResult 类型,而ViewResult 继成ActionResult
 4、action如何将数据传入视图?
  1.0 通过 ViewData["name"]给视图传值 ViewData["name"] = "八戒";
  2.0 ViewBag 给视图传值   ViewBag.Age = 500;  本质上ViewBag 的设置和赋值都是操作的ViewData
  3.0 TempData["Name"] 给视图传值 TempData["Name"] = "八戒11";
  4.0 通过View()指定返回的实体 
     Person person= new Person() { Name = "汉尼拔", Age = 10 };
            return View(person);
   
7、 HttpGet,HttpPost特性
  如果一个方法标记了HttpGet 特性,则该方法只负责处理get请求
  如果一个方法标记了HttpPost特性 特性,则该方法只负责处理Post请求

8、ActionResult子类演示
    8.1、ViewResult() -->action方法中要想返回视图,则要使用ViewResult (MVC开发中用的最多)
    8.2、ContentResult() -->返回内容之用(特点,可以不需要有对应的视图) 
    8.3、JsonResult() -->HomeController 的JsonDemo() 可以用作ajax请求 ,注意:如果是get请求,则一定是要在Json()中写入:JsonRequestBehavior.AllowGet
    8.4、FileResult() -->HomeController 的FileResultDemo() 可以用作画验证码,也可以利用它来实现文件的下载
    8.5、HttpStatusCodeResult() --》用户自己设置需要响应的状态码
    8.6、JavaScriptResult 注意:JavaScript配合视图中的<script rc="/GroupInfo/JavaScriptResultDemo1">
    8.7、RedirectResult():执行页面跳转本质上是在响应报文头中产生了 Location:要跳转的页面的虚拟路径 命令
 8.8、RedirectToRouteResult :当系统中路由规则比较多的时候,可以由程序员指定使用哪个路由规则来生成url
 
注意:9、Server.Transfer()跳转只能跳转到aspx页面,不能跳转到.ashx文件,在MVC使用Server.Transfer("/Home/Index") 也会报错

一、从action中返回指定的视图
return View(): 去当前action所在的控制器同名的views下的文件中查找和action同名的视图
return view("targetview2"):去当前action所在的控制器同名的views下的文件中查找指定的targetview2 的视图
return View("~/Views/Test/Index.cshtml"); 去指定的目录中查找视图

二、_viewstart.cshtm ,_layout.cshtml:
_viewstart.cshtm:
1、如果当前_viewstart.cshtm处在views下面的,那么当前views所有的视图被访问的时候,都会先执行_viewstart.cshtm
2、如果在某个目录Home下也存在一个_viewstart.cshtm,那么会先执行views跟目录下的_viewstart.cshtm中的内容,再执行Home目录下的_viewstart.cshtm中的内容

_layout.cshtml:
作用:给整个网站进行风格定位,如果子页面使用了此_layout.cshtml,那么它的样式则就是_layout.cshtml中的样式
作用相当于asp.net中的母板页(.master)
@RenderBody():作用:RenderBody仅仅只是当前布局页中的占位符,它会被子页面中的内容替换,@RenderBody() 只能在layout中出现一次
 @Styles.Render("~/Content/css"):作用,会根据虚拟路径"~/Content/css" 来找到该虚拟路径下注册好的所有css文件响应给浏览器
 @Scripts.Render("~/bundles/jquery")作用,会根据虚拟路径"~/bundles/jquery" 来找到该虚拟路径下注册好的所有js文件响应给浏览器
 注意:要正常使用@Styles.Render()和@Scripts.Render() 的必要条件,必须在程序启动的时候,必须执行Global.asax 文件中的  
 BundleConfig.RegisterBundles(BundleTable.Bundles);代码 ,作用是 将类似于"~/Content/css"的虚拟路径和其物理文件做一一映射,否则不能使用
 原因:1、自动压缩js和css的文件大小  2、方便程序来开发导入到视图页面
 
@RenderSection("scripts", required: false) 作用:
RenderSection 所定义的标签,可以被子页面重写,如果required设置成true,则必须子页面重写,如果是false可以不重写也可以重写

Razor语法小结:

 Razor视图:
  扩展名:.cshtml
  @:Razor 语法 ,在@{}中所写的代码都是c#代码

例如:

div>
        输出html文本
        <hr />
        @{           
            string astr = "<a href='http://www.baidu.com'>导航到baidu</a>";
          //1.0 利用 Html.Raw ()方法来正常输出html标签
            @Html.Raw(astr)
            <br />
            //2.0 利用  MvcHtmlString来正常输出html标签
            MvcHtmlString mvcstring = new MvcHtmlString(astr);
            @mvcstring
            @mvcstring.ToHtmlString()
            <br />
            //3.0  利用 HtmlString来正常输出html标签
            HtmlString htmlstring = new HtmlString(astr);
            @htmlstring
            @htmlstring.ToHtmlString()            
        }

        <hr />
        @@astr= 
        @{
            //4.0 @: astr 作用:会将@:后面的变量 当做字符串输出   ,注意:@:只能写到@{} 花括号中
            //4.0.1 @表示转义符  输出@astr到网页则必须写:@@astr ,只能   @{} 花括号外
            @:astr; 
        //4.0.2 <text><text>  将包括在其中的变量当做字符串输出,而不是输出变量的值,<text></text>只能写在@{} 花括号中
            <text>astr</text>
        }

        <hr />
        <span style="font-size: 16px; color: blue;">5.0 调用有返回值的方法:</span>
        @{ 
            string res = MVC.Site.helper.Kits.GetValue("你好");
            @res
        }
        <br />
        5.0.1 直接使用@@符号即可输出
        <br />
        @MVC.Site.helper.Kits.GetValue("你好啊")
        <br />
        Response.Write()输出 :如果使用@@来调用无返回值的方法则必须将其放入{}中
        @{Response.Write(MVC.Site.helper.Kits.GetValue("你好啊11"));}

        <br />
        <hr />
        6.0 调用泛型方法
        @{
            //调用泛型方法获取返回值赋值给resint
            int resint = MVC.Site.helper.Kits.GetTResult<int>(100);
                //输出结果到屏幕:
            @resint
        }
        <br />
        6.0.1   直接使用@@()  来调用泛型方法
        @(MVC.Site.helper.Kits.GetTResult<decimal>(12.38m))

        <hr />
        操作web上下文中的相关对象
        @HttpContext.Current<br />
        @Response<br />
        @@Request.QueryString["id"]=   @Request.QueryString["id"]<br />
        @Server<br />
        @Session<br />
        @Cache<br />
        @HttpContext.Current.Server.GetLastError() //gloabl.asmx中的Application_Error()收集当前没有try{}catch{}的异常信息

        <hr />
        7.0 数据类型转换相关扩展方法<br />
        @("123a".AsInt())  等价于  @@{ int.TryParse()}
        @("123".IsInt())   结果:true

        @("123.4".AsDecimal())
        @("123.4".IsDecimal())
        <hr />
        8.0 @@后面有空格的语境
        <span>JamesZou@Itcast.us</span>
        <br />
        当@后面有空格的时候 后面的文本会当做变量使用
        <span>JamesZou@@ Itcast.us</span>
        <br />

        <hr />
        9.0 路径转换 "~/home/index"
        @@Href("~/home/index")  = @Href("~/home/index")

        <hr />
        10.0 可以在Razor视图中自己定义方法供Razor调用
        @helper  CreateH2(int num)
{
    for (int i = 0; i < num; i++)
    {
            <h2>@i</h2>
    }
        
        }
        @CreateH2(5)      
    </div>

二、HtmlHelper类中的扩展方法
 @Html.TextBoxFor(c => c.Name, new  { @class="red" })
 @Html.DropDownListFor(c => c.GroupId, ViewData["slist"] as SelectList)
 @Html.CheckBoxFor(c=>c.IsKill)
 @Html.TextAreaFor(c=>c.Name)
  
  
  @Html.TextBox("id1", Model.ID, new { @class = "green", style = "font-size:18px" });<br />
 @Html.DropDownList("gid", ViewData["slist"] as SelectList)
 <br />
 <input type="checkbox" id="IsKill" name="IsKill" value="" />
 @Html.CheckBox("IsKill", Model.IsKill);
 <br />
 <input type="hidden" />
 @Html.Hidden("ID", Model.ID)
 <br />
 @Html.ListBox("type", ViewData["slist"] as SelectList)
 <br />
 @Html.RadioButton("type1", "1", true)
 @Html.RadioButton("type1", "2", false)

三、 模型注解(特性) 和 非侵入式脚本(fromvalidate.js) (配合使用可以实现页面前端控件值的验证(非空验证,输入值的合法性验证))
 注解:就是往实现属性上添加特性:Required,StringLength等。。。

1、模型实体属性注解
 Required特性:可以实现对视图页面上对应的模型中属性文本框进行非空验证
 StringLength:约束属性值的长度
 DisplayName:在视图上可以利用 @Html.DisplayName() @Html.DisplayNameFor (),@Html.LabelFor 来显示具体的值 (演示在c10/Index)下 
 Compare:将当前附加了此特性的属性值与目标属性值比对,如果不相等则不通过并且提示给用户(在用户注册页面的 确认密码的时候可以使用)
 RegularExpression:可以由程序员自由编写正则表达式来对属性值进行约束
 DataType:标示附加的类型
 Remote:通过在属性上添加Remote特性,可以实现对当前属性值的内容进行重复性检查 ,Remote 是通过ajax请求来进行验证的,为了防止缓存一般写成post请求(位于System.Web.Mvc命名空间下)
 例如写法:
   [Remote("Check", "Home", ErrorMessage = "当前猫的名称已经被注册,请重写换一个",HttpMethod="post")]
        public string Name { get; set; }
  
 Remote必须有一个action来配合它的使用,如果action中返回的值为 false,则表示当前文本框中的值已经存在,否则可以使用 true
  public ActionResult Check()
        {
            //1.0 先获取remot发送给check的参数Name的值
            string name = Request.Form["Name"];
            if (name == "ZPP")
            {
                return Content("false");
            }
            else
            {
                return Content("true");
            }
        }
 
 Rang: 可以约束int型等类型的数值范围

要能够正常进行非空等合法性验证必须做如下步骤:
1、必须在实体的每个string类型的属性上加上Required特性
2、必须在视图上导入如下脚本:
 1、 <script src="~/Scripts/jquery-1.8.2.min.js"></script>
    2、 <script src="~/Scripts/jquery.validate.js"></script>
    3、 <script src="~/Scripts/jquery.validate.unobtrusive.js"></script> @*非侵入式js脚本*@
 
3、将web.config中的<appSettings> 节点中的ClientValidationEnabled 设置成true 才能实现客户端的验证
  <add key="ClientValidationEnabled" value="true" />
  
4、必须是在做post提交的时候此验证才有效


 4、视图上的控件必须使用:

 @Html.TextBox("Name") 或者@Html.TextBoxFor("Name") 来显示
 @Html.ValidationMessage("Name")作用:当文本框输入的值不合法的时候,提示语句就是用@Html.ValidationMessage("Name") 来显示给用户

1、在实体模型属性上添加 DataType
 DataType:表示附加的类型
 @Html.Editor()方法
 实例写法:
  public class DataTypePig
    {
        [DataType(System.ComponentModel.DataAnnotations.DataType.Text)]
        public string Name { get; set; }
        [DataType(System.ComponentModel.DataAnnotations.DataType.Password)]
        public string Pwd { get; set; }
        [DataType(System.ComponentModel.DataAnnotations.DataType.PhoneNumber)]
        public string Phone { get; set; }          
        public bool isKill { get; set; }
        public int Age { get; set; }
    }
 在视图上使用@Html.EditorFor()泛型方法来自动根据DataType的类型决定生成什么样的html标签
 <tr>
                <th>名字:</th>
                <td>@Html.EditorFor(c => c.Name)</td>
            </tr>
            <tr>
                <th>密码:</th>
                <td>@Html.EditorFor(c => c.Pwd)</td>
            </tr>
            <tr>
                <th>电话:</th>
                <td>@Html.EditorFor(c => c.Phone)</td>
            </tr>
               <tr>
                <th>是否可以杀:</th>
                <td>@Html.EditorFor(c => c.isKill)
                </td>
            </tr>
 

2、分部视图
 分部视图是什么:类似于asp.net webform (aspx)中的用户自定义控件 .ascx
 作用:可以将相同的逻辑块写到分部视图中,供其他视图来使用@Html.Partial()来调用
 @Html.Partial("Index", new MVC.Site.Pig() { Name="八戒" }):
 方法的参数1 :表示请求当前控制器的下Index方法
 参数1:向分部视图传入Model实体
 Server.Execute();
     请求分部视图的方式1:<br />
        @Html.Partial("Index", new MVC.Site.Pig() { Name = "八戒" })

        <hr />
        请求分部视图的方式2:<br />
        @{Html.RenderPartial("Index", new MVC.Site.Pig() { Name = "八戒" });}

        <hr />
        请求分部视图的方式3:<br />
        @{Html.RenderAction("Index", new { controller = "C14PartalView" });}
        
        <hr />
        请求另外一个验证码的action 类似于asp.net中的服务器包含 Server.Execute()
        @{Html.RenderAction("View1", "C01");}

扩展:
  return PartialView();与  return View();区别
  1、return PartialView()不会执行views目录下的_ViewStart.cshtml,而return View() 会执行views目录下的_ViewStart.cshtml

 3、在控制器的action中进行参数合法性验证

重点:由于用户可以将浏览器的js脚本禁用,那么就会导致网站的非侵入式验证脚本失效
所以,除了在客户端进行合法性验证外还应该在action方法中进行服务器端的验证:
代码写法步骤:
1、在action方法体第一步加入   if (ModelState.IsValid == false)  //表示验证不通过,将信息返回给视图
2、可以利用 ModelState.AddModelError("", ex.ToString()); 追加自定义提示信息
3、在视图可以 利用@Html.ValidationSummary(false);  将程序员自定义的异常提示信息给用户,如果是true,则将非侵入式验证脚本验证(属性的验证信息)的错误信息也显示出来


 
3、@Url中的扩展方法
 @Url.Action():会根据当前网站路由规则的占位符自动生成url
 @Url.Content():仅仅只是将~去掉 
 
4、@Ajax中的扩展方法
 @Ajax.ActionLink()
 @Ajax.BeginForm()
 @Ajax.BeginRouteForm():告诉MVC是当前url是根据哪个路由规则生成的
 
二、AjaxHelper中扩展方法
2.1、ajax.actionLink()方法可以生成异步请求的<a></a>标签
使用步骤:
1、必须添加如下两个脚本
 <script src=\"~/Scripts/jquery-1.8.2.min.js\"></script>
 <script src=\"~/Scripts/jquery.unobtrusive-ajax.js\"></script>
2、利用@Ajax.ActionLink()方法生成<a></a>标签,ActionLink方法会自动在<a>标签上添加 data-ajax="true" 的属性,data-ajax="true" 可以被jquery.unobtrusive-ajax.js
读取执行异步请求,请求的url为 <a>标签上的属性 href 中的值
写法实例:
@Ajax.ActionLink("获取服务器时间", "GetServerTime", new { controller = "Ajax" }, new AjaxOptions()
   {
       HttpMethod = "get",
       OnSuccess = "sucuess",
       OnBegin = "begin",
       OnComplete = "comp",
       OnFailure = "failure",
       Confirm = "您确认请求吗?",
       InsertionMode = InsertionMode.Replace,  //InsertionMode.Replace:将最后的响应结果替换UpdateTargetId 所对应的dom元素中的内容
       //InsertionMode.InsertAfter:将最后的响应结果插入到UpdateTargetId 所对应的dom元素中的内容 之后
       //InsertionMode.InsertBefore:将最后的响应结果插入到UpdateTargetId 所对应的dom元素中的内容 之前
       UpdateTargetId = "result",  // 可以设置服务器响应回来的数据到指定id的dom元素中
       LoadingElementId = "lbloding",
       LoadingElementDuration = 10000
   })
   
2.2 利用Ajax的BeginForm 方法可以异步提交表单
写法实例:
 @using (Ajax.BeginForm(new AjaxOptions() { HttpMethod = "post", InsertionMode = InsertionMode.Replace, UpdateTargetId = "displayResult", OnSuccess = "sucess", OnBegin = "begin", OnComplete = "comp", OnFailure = "failure", Url = Url.Action("PostSumbmit", "AjaxBeginForm") }))
        {
            @Html.DisplayNameFor(c => c.Name)<span>:</span>
            @Html.TextBoxFor(c => c.Name)
            @Html.ValidationMessageFor(c => c.Name)

            @Html.DisplayNameFor(c => c.Age)
            @Html.TextBoxFor(c => c.Age)

            @Html.DisplayNameFor(c => c.Gender)
            @Html.CheckBoxFor(c => c.Gender)
            
            <input type="submit" value="提交" />
        }

其中OnSuccess 回调函数中的参数值分为如下2中:
1、如果响应报文头中的Content-Type为text/html 则参数值直接为响应报文体中的文本数据
2、如果响应报文头中的Content-Type为application/json 则参数值会是已经将json字符串转换好的js对象


非侵入式脚本可以在web.config中进行全局控制
  <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
 以上表示开启所有页面的非侵入式脚本
 
  以下两个脚本表示关闭所有页面的非侵入式脚本
   <add key="ClientValidationEnabled" value="false" />
    <add key="UnobtrusiveJavaScriptEnabled" value="false" />
 
也可以在某个视图页面手动关闭非侵入式脚本
div>
        @{
            //关闭当前add.cshtml页面上所有的非侵入式(非介入式)脚本
            Html.EnableUnobtrusiveJavaScript(false);} 
        @{
            //关闭当前add.cshtml页面上的参数合法性验证
            Html.EnableClientValidation(false);
            } 
 
 

一、路由规则及约束
路由约束之一:参数类型约束
 1、RouteDebugger.dll的作用:
 可以在当前请求的页面上打印出当前url所匹配的路由规则有哪些?并且告诉用户当前url使用的路由规则是哪条
 
 2、RouteDebugger.dll的用法
 2.1、在当前MVC项目中引用RouteDebugger.dll
 2.2、在当前mvc项目中的web.config的<appSettings>几点中添加:
 <!--将路由调试插件打开,true:打开调试器,false:关闭调试器-->
    <add key="RouteDebugger:Enabled" value="true" />

3、  
             * 注意点:
             * 1、如果有多条路由规则的时候,要保证每个路由规则的名字不同
             * 2、如果一个url匹配成功了多条路由规则,则以最前面的那条为准(匹配成功的第一条路由规则为准)

4、 
  /*可以匹配Default 路由规则的url有:
             *1、 http://localhost/Home/Index  
             *2、 http://localhost/Home/Index/100 
            */
 routes.MapRoute(
 name: "Default",  //路由规则的名称
 url: "{controller}/{action}/{id}", //路由规则的正则表达式(url的占位符)
 defaults:   //设置url的占位符中{controller},{action},{id}的默认值
 new
 {
  controller = "Home"  //当前给controller设置的是默认去访问home控制器
 ,
  action = "Index"// 默认去访问home控制器中Index 方法
 ,
  id = UrlParameter.Optional   //表示设置当前id参数为可选参数
 }
  , constraints:  //constraints:给路由规则添加约束
  new 
 {
  id = "\\d+"  //约束当前Default路由规则的匹配id参数只能是数字
 }
 , namespaces: new string[] { "ControllerA" }  //作用:如果指定了namespaces 则当url匹配成功此路由规则后,
 //自动去程序员指定的namespaces中查找相应的控制器,
 //好处:1、隔离不同程序员写的控制器  2、当url匹配到此规则时,只会去程序员指定的namespaces中查找相应的控制器,大大提高了反射时的扫描效率
);

路由约束之二:命名空间约束
写法:
   routes.MapRoute(
                name: "Default",
                url: "itcast/{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
                , constraints: new { id = "\\d+" }  //约束id只能是数字
                , namespaces: new string[] { "MVC路由约束.Controllers" } 
            );
好处:1、可以自动去MVC站点的bin目录查找指定命名空间下的控制器类,大大节省了查找时间,效率更优
   2、方便同一个路由规则在不同控制器之间的切换

   
//由于mvc中有aspx和razor两套视图引擎,并且排序为:1、aspx视图引擎,2、Razor引擎
//所以我们只要移除0索引处的元素即可
 ViewEngines.Engines.RemoveAt(0);
 
二、区域(Areas)
 注意点:1、所有的区域必须放在mvc主站点的 Areas文件夹下 (插件开发)
   2、每个区域下都要有个一个继承了AreaRegistration 父类的子类,并且在子类中要重写如下两个:
   1、区域名称
     public override string AreaName
        {
            get
            {
                return "OnlinePay";
            }
        }
  
  2、当前区域的路由规则注册方法(作用:负责注册当前区域下的所有路由规则的)
   public override void RegisterArea(AreaRegistrationContext context)
        {
            context.MapRoute(
                "OnlinePay_default",
                "OnlinePay/{controller}/{action}/{id}",
                new { action = "Index", id = UrlParameter.Optional }
    //参数约束
    //命名空间约束
            );
  }
   
   

三、MVC中的相关过滤器 
  
 3.1 、action过滤器 (方法过滤器) 和result过滤器 (结果过滤器)
  应用:一般用于【统一登录验证】和【权限验证】 一般写在OnActionExecuting()方法中
  
  
  作用:类A必须要继成ActionFilterAttribute,并且重写里面的
  OnActionExecuting():在action()方法的逻辑执行之前会先执行OnActionExecuting()中的逻辑
  和OnActionExecuted:在action()方法的逻辑执行之后会执行OnActionExecuted()中的逻辑
  
  action过滤器用法步骤:
  1、自己定义一个继成了类ActionFilterAttribute的自定类名字叫做ActionFilterAttribute1
  2、在App_Start/FilterConfig.cs文件中的public static void RegisterGlobalFilters(GlobalFilterCollection filters) 方法中
  添加自定义过滤器的注册代码:  filters.Add(new ActionFilterAttribute1());
  3、自定义过滤器如果没有在FilterConfig.cs中进行全局注册,则可以在某个action方法上添加特性标签
  例如
  [MVCFilter.Filters.ActionFilterAttribute1]
  public ActionResult Index()
  {
   Response.Write("这是Index()方法中输出的文本<br />");
   return View();
  }
  
  4、如果想在控制器Home中的所有方法都能够被自定义过滤器切入
  
  
 3.2、AuthorizeAttribute 验证过滤器
  特点:在action过滤器运行前执行
  注意:在重写的过程中如果执行了base.OnAuthorization(filterContext); 则会跳转到登录页面
  解决方法有两个:
  1、在action上贴上[AllowAnonymous] 特性标签
  2、在过滤器重写的OnAuthorization方法中不调用base.OnAuthorization(filterContext);
  例如:
   public override void OnAuthorization(AuthorizationContext filterContext)
        {            
            filterContext.HttpContext.Response.Write("----这是OnAuthorization--输出的<br />");
            //base.OnAuthorization(filterContext); //注意此处有注释掉所以不会转到登录页面
        }
  
 3.3、HandleErrorAttribute 异常捕获过滤器
  特点:可以统一捕获当前MVC网站中的异常信息
  
  

 
一、统一跳转到error.cshtml 的系统配置
 1、如果实现了全局异常过滤器HandleErrorAttribute
  a) 请将  filterContext.ExceptionHandled 设置成 false  写法:  filterContext.ExceptionHandled = false;
  b)在mvc网站的跟目录下的 web.config 中   <system.web> 节点中添加 <customErrors mode="On" defaultRedirect="Error"></customErrors>
  c)将Views/Shared/Error.cshtml 指定为 @model HandleErrorInfo
  
 

二、webapi
 1、webapi的路由规则注册在App_Start\WebApiConfig.cs文件中
 2、webapi控制器继承父类 apiController
 3、调用webapi的方式:
  get请求http://localhost/api/home/1 则默认请求 Home控制器下的Get方法将1作为get()方法的参数
  Post请求http://localhost/api/home/1 则默认请求 Home控制器下的Post方法将1作为Post()方法的参数
 4、将webapi默认的返回格式设置成json格式写法
   public static class WebApiConfig
  {
        public static void Register(HttpConfiguration config)
        {
            //将webapi中的XmlFormatter 移除,默认就是以JsonFormatter作为其传输格式
            config.Formatters.Remove(config.Formatters.XmlFormatter);
  }

posted @ 2017-10-26 11:19  忧叹ic  阅读(1118)  评论(2编辑  收藏  举报