3

我想使用相同的視圖來編輯博客文章並添加博客文章。但是,我遇到了該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對應方法不同。

感謝您的幫助!讓我知道如果你找到一個更好的方式來完成這項工作。我唯一不滿意的部分是接受一個不必要的變量來使方法簽名不同。

回答

2

有幾個選項:

  • 讓您Id財產Nullable和檢查HasValue
  • 將某種mode指標添加到您的ViewData並根據值顯示隱藏字段。
  • 將表單的正文放在部分視圖中,並將其包含在兩個不同的視圖中,一個視圖和一個沒有隱藏視圖的視圖。
2

我在我的項目所做的是以下幾點:

  • 有編輯獨立的動作和視圖並將沿編輯URL對象的ID,而不是在一個隱藏字段
  • 通行證
  • 使用共享的模板編輯器爲對象,以避免寫相同的樣板代碼兩次

如果你這樣做正確的添加和編輯的意見將是非常小的。

+3

爲什麼使用單獨的控制器進行編輯和添加?這些似乎應該是* same *控制器的單獨操作。 – 2011-02-16 23:54:46

+0

哎呀!這是一個錯字。我的意思是單獨行動。我有兩個動作而不是一個,因爲編輯和添加使用LINQ to Entities時需要一些不同的代碼。在添加動作中,我可以在方法的參數中直接建模綁定到對象。在編輯操作中,我需要先拉起實體,然後使用`UpdateModel`方法。 – 2011-02-17 01:39:35

相關問題