[此篇文章收錄於其他博客,作為筆記使用]
一· 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/ ~_~
