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

另:推薦個優惠券網站:http://ntaotao.com/   ~_~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM