【ASP.NET MVC】我的複習整理

一、爲 Action 標註 Attribute 限制訪問

public class HomeController : Controller
{
    [HttpPost]
    public ActionResult Index()
    {
        return View();
    }
}

那麼該 Index 的 Action 就只可以經過 Post 方法請求,其它例如 Get 方法請求則響應 404。php

二、設置 View 所使用的 Model

假設有 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

三、Model 驗證

修改 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>

效果:

QQ截圖20150909163453

四、修改 Route 路由假裝成 php

查找項目中的 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 中添加一項,以下圖:

QQ截圖20150909171426

而後就能夠訪問了,輸入例如 /Home-Index-0.php 之類的 url。效果:

QQ截圖20150909171750

固然也能夠改爲 jsp 或者其它來裝逼。

五、Route 路由中的 UrlParameter.Optional

接下來說解 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 關鍵字的做用。

六、繼承 ActionFilterAttribute 實現 AOP 面向切面編程

首先咱們須要新建一個 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,算是簡單複習下。

相關文章
相關標籤/搜索