public class HomeController : Controller { [HttpPost] public ActionResult Index() { return View(); } }
那麼該 Index 的 Action 就只可以經過 Post 方法請求,其它例如 Get 方法請求則響應 404。php
假設有 Person 類。jquery
則 Controll 代碼:chrome
public class HomeController : Controller { public ActionResult Index() { var model = new Person();// 構建或從數據庫獲取一個 Person 類實例。 return View(model); } }
或者能夠設置 ViewData 的 Model 屬性。數據庫
public class HomeController : Controller { public ActionResult Index() { var model = new Person(); ViewData.Model = model; return View(); } }
View 代碼:編程
@* 聲明該 View 的 Model 類型 *@
@model Namespace.Person
……
@* 輸出 Person 對象的 Name 屬性 *@
@Model.Name
……
固然不聲明 View 的 Model 類型也是能夠的,可是這會失去 Model 類型約束以及語法提示等功能。瀏覽器
在聲明瞭 Model 類型的狀況下,View 繼承自 WebViewPage<TModel> 抽象類。jsp
而不聲明 Model 類型的狀況下,View 則繼承自 WebViewPage<dynamic> 抽象類。ide
修改 Person 類,添加相應的 ValidationAttributeui
public class Person { [Required] [StringLength(5)] public string Name { get; set; } [Range(0, 150)] public int Age { get; set; } [Required] [EmailAddress] [DataType(DataType.EmailAddress)] public string Email { get; set; } }
Controller 驗證:url
public class HomeController : Controller { [HttpPost] public ActionResult Create(Person person) { if (ModelState.IsValid) { return Content("驗證成功"); } else { return Content("驗證失敗"); } } }
View 中的客戶端驗證:
<body> @* 引用 jquery 以及客戶端驗證腳本 *@ <script src="~/Scripts/jquery-1.8.2.min.js"></script> <script src="~/Scripts/jquery.validate.min.js"></script> <script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script> @using (Html.BeginForm()) { <div> @Html.LabelFor(model => model.Name) @Html.EditorFor(model => model.Name) @Html.ValidationMessageFor(model => model.Name) </div> <div> @Html.LabelFor(model => model.Age) @Html.EditorFor(model => model.Age) @Html.ValidationMessageFor(model => model.Age) </div> <div> @Html.LabelFor(model => model.Email) @Html.EditorFor(model => model.Email) @Html.ValidationMessageFor(model => model.Email) </div> <div> <input type="submit" value="提交" /> </div> } </body>
效果:
查找項目中的 RegisterRoutes 方法。默認路由以下:
public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); }
主要關心 MapRoute 這個擴展方法的 url 參數和 defaults 參數。在 url 參數中,經過花括號映射參數名,例如 {controller} 則映射到 controller,{id} 則映射到 id。因此若是有 /A/B/C 的 url 傳入,則映射到 AController 的 B 方法並傳入 C 做爲 id 參數的值。
固然咱們也能夠簡單修改路由來簡單僞形成 php 頁面。
修改 url 爲 "{controller}-{action}-{id}.php"。
而後在項目根目錄的 Web.config 中添加一項,以下圖:
而後就能夠訪問了,輸入例如 /Home-Index-0.php 之類的 url。效果:
固然也能夠改爲 jsp 或者其它來裝逼。
接下來說解 defaults 參數,這個參數須要構造一個匿名類,而且這個匿名類的屬性的名稱須要跟 url 中相同。(固然多出一些沒用到的屬性也可)
默認路由中,controller 和 action 兩個都很好懂,就是沒有值的時候,分別使用 Home 和 Index。但 id 這個就不太好懂了。
通過查閱 msdn 及前人相關的資料咱們能夠知道,UrlParameter.Optional 是指倘若沒有提供值,則給予默認值。仍是舉個例子吧。
例如:
public class HomeController : Controller { public ActionResult Index(int id) { return View(); } }
那麼這裏的 id 就是 0。
public class HomeController : Controller { public ActionResult Index(string id) { return View(); } }
那麼如今這個的 id 就是 null。
可見,UrlParameter.Optional 就至關於 default 關鍵字的做用。
首先咱們須要新建一個 Attribute 並繼承 ActionFilterAttribute。我就叫 TestActionAttribute 好了。
public class TestActionAttribute : ActionFilterAttribute { public override void OnActionExecuted(ActionExecutedContext filterContext) { Debug.WriteLine("OnActionExecuted"); base.OnActionExecuted(filterContext); } public override void OnActionExecuting(ActionExecutingContext filterContext) { Debug.WriteLine("OnActionExecuting"); base.OnActionExecuting(filterContext); } public override void OnResultExecuted(ResultExecutedContext filterContext) { Debug.WriteLine("OnResultExecuted"); base.OnResultExecuted(filterContext); } public override void OnResultExecuting(ResultExecutingContext filterContext) { Debug.WriteLine("OnResultExecuting"); base.OnResultExecuting(filterContext); } }
而後標註到 Action 上,運行。
咱們能夠見到按順序輸出:
OnActionExecuting
OnActionExecuted
OnResultExecuting
OnResultExecuted
在前面兩個方法間是執行咱們的 Action,在後面兩個方法間是執行咱們 Action 返回的 ActionResult。
那麼這東西有什麼用呢。舉個小例子,能夠用作驗證。
修改 OnActionExecuting 方法。
public override void OnActionExecuting(ActionExecutingContext filterContext) { var request = filterContext.HttpContext.Request; var userAgent = request.UserAgent; if (userAgent.IndexOf("chrome",StringComparison.OrdinalIgnoreCase)>=0) { filterContext.Result = new ContentResult() { Content = "chrome 禁止訪問" }; } }
這裏咱們檢測 UserAgent,若是是 chrome 那麼就不能訪問了。
運行以後,咱們會發現 chrome 輸出禁止訪問,而 ie 等其它瀏覽器則仍然能繼續訪問。同時咱們也能夠經過斷點驗證到,chrome 訪問的狀況下,標註的 Action 的方法體不會再執行,即設置了 filterContext 的 Result 屬性以後,就再也不往下執行 Action 的流程了。(ActionResult 的流程仍是依然執行的,也就是說 OnResultExecuting 和 OnResultExecuted 仍是會繼續執行的說)
這個只是個小例子,具體實際業務狀況能夠作用戶登陸驗證、日誌記錄等等。
很久沒碰 ASP.NET MVC,算是簡單複習下。