我想使用相同的視圖來編輯博客文章並添加博客文章。但是,我遇到了該ID的問題。添加博客文章時,我不需要發佈ID值。當模型綁定將表單值綁定到控制器中的BlogPost
對象時,它將自動生成實體框架實體中的ID。使用相同表單添加和編輯的ASP.net MVC 2.0
當我編輯博客文章時,我需要一個隱藏的表單字段來存儲該ID,以便它伴隨下一個表單發佈。這是我現在的觀點。
<% using (Html.BeginForm("CommitEditBlogPost", "Admin"))
{ %>
<% if (Model != null)
{ %>
<%: Html.HiddenFor(x => x.Id)%>
<% } %>
Title:<br />
<%: Html.TextBoxFor(x => x.Title, new { Style = "Width: 90%;" })%>
<br />
<br />
Summary:<br />
<%: Html.TextAreaFor(x => x.Summary, new { Style = "Width: 90%; Height: 50px;" }) %>
<br />
<br />
Body:<br />
<%: Html.TextAreaFor(x => x.Body, new { Style = "Height: 250px; Width: 90%;" })%>
<br />
<br />
<input type="submit" value="Submit" />
<% } %>
眼下檢查,如果該模型在未來NULL是要知道,如果我編輯博客中或添加一個,因爲當我加入的話,會爲空,因爲它不是招」的好方法尚未創建。出現錯誤並且實體無效時會出現問題。當控制器在無效模型後呈現表單時,Model != null
的計算結果爲false,儘管我們正在編輯帖子,並且顯然有一個模型。如果在添加帖子時爲ID提供隱藏的輸入字段,則會出現錯誤,指出ID不能爲空。
任何幫助表示讚賞。
編輯:我跟OJ回答了這個問題,但是我發現了一些讓我感到無聊的東西,我想分享它,以防萬一任何人有類似的問題。添加/編輯博客的頁面甚至不需要隱藏的ID字段。原因是因爲當我去添加一個博客時,我對這個相對URL做了一個GET BlogProject/Admin/AddBlogPost
這個URL不包含一個ID,action方法只是呈現頁面。添加博客文章時,該頁面會對相同的URL進行POST。傳入的BlogPost
實體由模型綁定填充,並具有一個空ID,在保存更改期間將由EF生成該ID。
現在編輯博客文章的網址時是BlogProject/Admin/EditBlogPost/{Id}
此URL包含博客文章的id,因爲頁回發到網址完全相同的ID去與POST到執行編輯的操作方法。
我遇到的唯一問題是操作方法不能具有相同的簽名。
[HttpGet]
public ViewResult EditBlogPost(int Id)
{
}
[HttpPost]
public ViewResult EditBlogPost(int Id)
{
}
如果您嘗試使用上述兩種方法,編譯器會對您大叫。在做一個Html.BeginForm()
時,Id會被重新發回,而且沒有參數或控制器,這太方便了。因此,而不是更改POST方法的名稱,我只是修改了參數以包含FormCollection
。就像這樣:
[HttpPost]
public ViewResult EditBlogPost(int Id, FormCollection formCollection)
{
// You can then use formCollection as the IValueProvider for UpdateModel()
// and TryUpdateModel() if you wish. I mean, you might as well use the
// argument since you're taking it.
}
的的FormCollection變量通過模型與Request.Form
將是默認的相同的內容綁定填補。您不必將此集合用於UpdateModel()
或TryUpdateModel()
,但我只是這麼做的,所以我不覺得這個集合是毫無意義的,因爲它實際上只是使方法簽名與GET對應方法不同。
感謝您的幫助!讓我知道如果你找到一個更好的方式來完成這項工作。我唯一不滿意的部分是接受一個不必要的變量來使方法簽名不同。
爲什麼使用單獨的控制器進行編輯和添加?這些似乎應該是* same *控制器的單獨操作。 – 2011-02-16 23:54:46
哎呀!這是一個錯字。我的意思是單獨行動。我有兩個動作而不是一個,因爲編輯和添加使用LINQ to Entities時需要一些不同的代碼。在添加動作中,我可以在方法的參數中直接建模綁定到對象。在編輯操作中,我需要先拉起實體,然後使用`UpdateModel`方法。 – 2011-02-17 01:39:35