一·  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);
  }

MVC知识点的更多相关文章

  1. ASP.NET MVC知识点总结

    一直都有把MVC的知识点总结出来的打算,今日终于得偿所愿.话不多说,开工!!! 一·  MVC MVC设计模式->MVC框架(前端开发框架),asp.net(webform) aspx M:Mo ...

  2. Spring MVC知识点整理

    网上Spring MVC相关知识点的介绍已经有很多了,但是大部分文章都是介绍其中的一部分知识点. 本文希望能够向读者做一个基本整体的介绍,首先我们先来了解下Spring MVC的基础接口和组件.   ...

  3. [Java] Spring MVC 知识点

    云图: @Service 用于标注业务层组件. 在 Spring-servlet 配置xml中,component-scan 标签默认情况下自动扫描指定路径下的包(含所有子包),将带有@Compone ...

  4. MVC 知识点学习2

    1._Layout.cshtml   @RenderBody() 2.自定义扩展HtmlHelper(需要添加Bootstrap.js或者Bootstrap.min.js文件到项目中) namespa ...

  5. WinForm,MVC知识点

    WinForm的一些基础知识,用来回忆自己遗忘的,唤醒自己的知识. 虽然现在有MVC但是我觉得还是要学习一下WinForm的,毕竟以前也被大家用了好多年. 基础知识01 1:一个控件有很多的事件,每个 ...

  6. Ninject.MVC 知识点记录

    Ninject 是跟Unity 差不多的DI容器.Ninject 推荐零配置,快速使用.小中型项目,最适合. 通过nuget,安装Ninject.MVC.略.参考博客:Ninject依赖注入      ...

  7. MVC知识点01

    1:母版页都 放在View/Shared里面,而且全部的视图页面都可以去用母板页. **母板的应用要用到嵌套,@RenderBody();将别的网页的内容全部显示在此处,它就相当于一个占位符. 2:架 ...

  8. MVC知识点02

    MVC基础知识详情 1:在MVC中如果要从前台页面(.aspx)获取参数,只需要将其两个页面的参数设置成一样的,这样子MVC中的机制就会自动的将参数的值传到方法中. 2:在MVC中的方法要是两个都是相 ...

  9. MVC知识点汇总

    一,MVC创建控制器,视图 1新建 ASP.NET MVC web应用程序项目,在Controllers文件夹下创建控制器,MVC 5 控制器,然后打开控制器,在所对应的控制器中会存在一个Action ...

随机推荐

  1. Mybatis 类的转换器

    想一个事情 ,例: 我数据库的表 定义了一个表student 里面有一个字段 stu_sex  int类型  可是我对应的实体类是 String 类型或者其他类型 这个时候 实体类与数据库表肯定对应不 ...

  2. iOS仿UC浏览器顶部频道滚动效果

    很喜欢用UC浏览器上网,当然不是给UC打广告,里面有很多酷炫的效果,值的学习,这次分享的是频道滚动的效果.动画效果如下: 实现的这个效果的关键是绘制,重写顶部Label的drawRect方法 gith ...

  3. grunt 常用插件

    grunt-contrib-uglify:代码压缩 grunt-contrib-jshint:检查js拼写错误 csslint:检查css语法错误

  4. django入门-模型-part2

    尊重作者的劳动,转载请注明作者及原文地址 http://www.cnblogs.com/txwsqk/p/6511177.html 完全翻译自官方文档 https://docs.djangoproje ...

  5. 使用deque模块固定队列长度,用headq模块来查找最大或最小的N个元素以及实现一个优先级排序的队列

    一. deque(双端队列) 1. 使用 deque(maxlen=N)会新建一个固定大小的队列.当新的元素加入并且这个队列已满的时候,最老的元素会自动被移除掉 >>> from c ...

  6. pickle 模块学习 常用方法

    内容提要: 1: pickle的主要作用 pickle主要用于python 于python 之间进行文件传出,网络传输 他同json 一样也是有4个函数 pickle.dumps(iterable)  ...

  7. C#-WebForm-AJAX阿贾克斯(二)★★★★★ajax的完整结构★★★★★

    ajax完整结构: $.ajax({ url:"",//服务器路径 data:{},//给服务端传递的参数,可以没有,也可以是多个 type:"post", / ...

  8. QuantLib 金融计算——基本组件之 DayCounter 类

    目录 QuantLib 金融计算--基本组件之 DayCounter 类 DayCounter 对象的构造 一些常用的成员函数 如果未做特别说明,文中的程序都是 Python3 代码. QuantLi ...

  9. CF1139D Steps to One 题解【莫比乌斯反演】【枚举】【DP】

    反演套 DP 的好题(不用反演貌似也能做 Description Vivek initially has an empty array \(a\) and some integer constant ...

  10. 2018南京网络赛 - Skr 回文树

    题意:求本质不同的回文串(大整数)的数字和 由回文树的性质可知贡献只在首次进入某个新节点时产生 那么只需由pos和len算出距离把左边右边删掉再算好base重复\(O(n)\)次即可 位移那段写的略微 ...