Asp.net MVC: BindingHelperExtension的UpdateFrom如何使用?

來源:互聯網
上載者:User

預備知識:擴充方法(Extension Method);Asp.net MVC一般的做法

以修改一篇blog為例,當我們再輸入框中輸入了修改的內容之後,通過點擊提交按鈕將新的blog內容提交到伺服器端,,我們可以修改blog的title,body和timestamp三項:

 

圖 1

我們可能寫出這樣的代碼:

[ControllerAction]public void Save(int id){      BlogDataContext dbBlog = new BlogDataContext();    Post post = dbBlog.Posts.Single(p => p.ID == id);
    post.Body = Request.Form["Body"];    post.Title = Request.Form["Title"];    post.Timestamp = DateTime.Parse(Request.Form["Timestamp"]);    dbBlog.SubmitChanges();    RedirectToAction(new { action = "Detail", id = post.ID });   }
 

這段代碼顯示了controller從view的Request中讀取內容,然後更新model。在新的Asp.net模型中,view的內容都放在Request.Form對象中,該對象是一個HttpValueCollection集合。

圖 2

仔細看它裡面儲存的值,實際上就是我們在以前看到的Request.QueryString,只是現在我們不用在Url中顯示地用?來寫出,而是由Asp.net MVC架構幫我們產生,它會自動讀取我們在form中定義的有些元素及其中所包含的內容。下面是一個form的例子,紅色標註的地方可以先忽略:

圖 3

BindingHelperExtension.UpdateFrom讓更新變得更加容易

回到更新blog內容的問題上來,下面的代碼可以完成更新任務:

post.Body = Request.Form["Body"]; 
post.Title = Request.Form["Title"]; 
post.Timestamp = DateTime.Parse(Request.Form["Timestamp"]);

但是這樣一個屬性一個屬性地修改Model的值很繁瑣,而且中間涉及到類型轉換。比如上面的DateTime類型的屬性Timestamp,嚴格的說我們應該在更新它的值之前坐類型判斷,空值判斷等等操作。當屬性超過10個甚至更多時,更新屬性的代碼加上類型轉換,錯誤處理等等,代碼的數量就比較打了。那麼有沒有更加簡便的做法呢?實際上在MvcToolkit.dll這個程式集中為我們提供了一個簡化操作的類,它就是UrlHelper,是一個擴充方法,可以附加到任何的Object類型的對象上

圖 4

添加對MvcToolkit.dll的引用,並引入名字空間

using System.Web.Mvc.BindingHelpers;

之後我們就可以使用BindingHelpExtension類了。

[ControllerAction]public void Save(int id){      BlogDataContext dbBlog = new BlogDataContext();    Post post = dbBlog.Posts.Single(p => p.ID == id);
post.UpdateFrom(Request.Form); //post.Body = Request.Form["Body"]; //post.Title = Request.Form["Title"]; //post.Timestamp = DateTime.Parse(Request.Form["Timestamp"]); dbBlog.SubmitChanges(); RedirectToAction(new { action = "Detail", id = post.ID }); }

這樣修改一個對象的屬性是不是很簡單呢?毫無疑問,而且這樣還帶來了另外一個好處,如果這個時候Post的屬性變了(屬性名稱或屬性個數),我們不需要修改Controller的代碼,需要修改的只是View部分

使用UpdateFrom的前提

UpdateFrom固然很好用,可是需要配合Form的Action來完成,而且它對於view中元素的定義有一定的要求。

  • Url.Action

先來看看Action。我們為Form添加Action,注意method屬性是post的,因為是提交給伺服器。

<form action="<%= Url.Action(new {action="Save",id=ViewData.ID}) %>" method="post">

這裡action的文法有一點怪異,實際上它產生後的Url是這樣的:

<form action="/MVCStudy/Blog/Save/10"  method="post"> 

這裡的Url實際上ViewPage的一個屬性,而該屬性又是UrlHelper的一個執行個體,所以這裡的Url.Action實際上System.Web.Mvc.UrlHelper類的方法Action,該類存在於System.Web.Extension.dll程式集中。

圖 5

至於Url.Action方法產生Url的原理,可以參考Scott的文章“ASP.NET MVC Framework's Routing Engine”

  • HtmlName——指定HtmlName,updatefrom才會生效。

這裡的HtmlName是指在使用HtmlHelper類來產生html元素時所需要指定的相應的html元素的名字:

圖 6

比如:

圖 7

這裡雖然產生id和name兩個屬性,但是Asp.net MVC使用的"name"。產生這一元素的代碼:

        <p class="body">            <%--<%=Html.TextArea("bodyOfBlog",ViewData.Body) %>--%>            <%=Html.TextArea("Body",ViewData.Body) %>                    </p>

注意這裡HtmlName一定要與對應的model的屬性名稱一致,否則無法完成更新。上述代碼中注釋掉的程式碼就是這樣一個例子。正確的HtmlName設定,請參考本文圖3。

總結

使用UpdateFrom可以為我們帶來很多便利,例如類型轉換、空值檢查之類,同時它也使得代碼更加容易維護,因為在controller中不需要理會model的具體的屬性,充分發揮了Data Banding的作用。讓架構為我們做更多的事,那麼我們就可以更省事。

如果你的UpdateFrom不起作用,那麼首先應該檢查一下Form的action以及HtmlName的設定是否正確.

引用此日誌的引用 URL 是:http://raderdotnet.spaces.live.com/blog/cns!3461738A506327E!542.trak引用此項的部落格

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.