Asp.net MVC3.0 入門教程之六—— 審視編輯方法和視圖

 

本文摘自:http://www.cnblogs.com/libinlink/archive/2011/05/13/2045315.html

審視編輯方法和視圖

 

在這一節中,您將審視movie控制器生成的響應方法和視圖。然後您將添加

一個自定義搜索頁面。

運行程序並通過在URL追加/Moives瀏覽movie控制器。把鼠標懸停在Edit

鏈接上,看看它執行的URL.

Edit的鏈接由視圖Views\Movies\Index.cshtml Html.ActionLink方法生成。

 

@Html.ActionLink("Edit", "Edit", new { id=item.ID }) 


 

Html對象是一個助手,它是WebViewPage基類暴露的屬性。助手的ActionLink方法可以很容易的生成

HTML超級鏈接,它指向控制器的響應方法。ActionLink的第一個參數超級鏈接的文本呈現(比如:

<a>Edit Me</a>),第二個參數是要調用的響應方法的名稱,最後一個參數生成路由數據的匿名對象

anonymous object,這裏指ID=4)。

您可以使用查詢字符串(query string)傳遞參數給響應方法。比如URL

http://localhost:xxxxx/Movies/Edit?ID=4傳遞ID=4給Movies控制器的Edit方法。

打開Movies控制器。有兩個Edit方法,如下所示:

//
// GET: /Movies/Edit/5

public ActionResult Edit(int id) 
{
    Movie movie = db.Movies.Find(id);
    return View(movie);
}

//
// POST: /Movies/Edit/5

[HttpPost]
public ActionResult Edit(Movie movie) 
{
    if (ModelState.IsValid) 
    {
        db.Entry(movie).State = EntityState.Modified;
        db.SaveChanges();
        return RedirectToAction("Index");
    }
    return View(movie);
}


 

注意第二個Edit方法前面是HttpPost屬性。它表明這個重載的Edit方法只能被POST

請求調用。您也可以給第一個Edit方法採用HttpGet屬性,但是這不是必須的,應爲

方法默認爲HttpGet(響應方法隱含的了HttpGet屬性將被認爲是HttpGet方法)。

HttpGet方法將電影的ID作爲參數,並使用實體框架的Find方法查找電影,然後返回被找

到的電影給視圖模板。當架構體系創建編輯模板是,它檢查Movie類併爲每個屬性生成

代碼去呈現<label><input>元素。下面的代碼展示了自動生成的Edit視圖模板:

 

@model MvcMovie.Models.Movie

@{
    ViewBag.Title = "Edit";
}

<h2>Edit</h2>

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>Movie</legend>

        @Html.HiddenFor(model => model.ID)

        <div class="editor-label">
            @Html.LabelFor(model => model.Title)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Title)
            @Html.ValidationMessageFor(model => model.Title)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.ReleaseDate)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.ReleaseDate)
            @Html.ValidationMessageFor(model => model.ReleaseDate)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Genre)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Genre)
            @Html.ValidationMessageFor(model => model.Genre)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Price)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Price)
            @Html.ValidationMessageFor(model => model.Price)
        </div>

        <p>
            <input type="submit" value="Save" />
        </p>
    </fieldset>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>


 

<form>中的<input>元素別用來回傳頁面到電影的編輯地址/Movies/Edit

當點擊Edit按鈕時,頁面的數據被回傳到服務器。

 

處理POST請求

 

由架構體系生成的屬性爲HttpGet的Edit方法沒有檢查傳給它的ID的有效性。

如果用戶刪除URL的ID片段,錯誤信息如下所示:

 

用戶還可以傳遞一個不存在的ID,比如:http://localhost:xxxxx/Movies/Edit/1234.您可以給

HttpGet Edit方法做兩點修改來限制URL。首先,把ID參數改爲默認值爲0 (id不是必須傳遞)。

您也可以在回傳電影對象給視圖模板之前,檢查Find方法是否真正的找到了電影信息。

public ActionResult Edit(int id = 0)
{
    Movie movie = db.Movies.Find(id);
    if (movie == null)
    {
        return HttpNotFound();
    }
    return View(movie);
}


如果沒有找到,HttpNotFound方法被調用。

所有的HttpGet方法都遵循類似的模式。它們獲取一個電影對象(在Index中返回對象列表),

然後傳遞模型給視圖。Create方法傳遞一個空電影對象給Create視圖。所有的方法(創建、

編輯、刪除)都有一個HttpPost的重載方法

在HTTP GET方法中修改數據存在安全風險,在博客

ASP.NET MVC Tip #46 – Don’t use Delete Links because they create Security Holes

中有描述。在HTTP GET方法中修改數據違反了HTTP的最佳實踐REST架構模式(其中規定,

GET請求不應改變應用程序狀態)。換句話,執行GET操作應該是一個無副作用的安全操作。

下一節:Asp.net MVC3.0 入門指南 7 展示查找頁面

微笑

原文網址:http://www.asp.net/mvc/tutorials/getting-started-with-mvc3-part6-cs

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章