2010-10-18 92 views
0

我敲我的頭靠在牆上這一段時間的列表,一些幫助,將不勝感激:asp.net的MVC:使用模板編輯器更新對象,

比方說我,我們有一個簡單的模型:

public class Contact { 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

和一個簡單的編輯寺廟:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Rpdc.Models.Contact>" %> 
FirstName: <% = Html.TextBoxFor(x => x.FirstName)%><br /> 
SecondName: <% = Html.TextBoxFor(x => x.LastName)%><br /> 

我要完成什麼,是做顯示可編輯聯繫人的列表,每個都有自己的「保存」按鈕。 如果我做這種方式:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IList<Rpdc.Models.Contact>>" %> 
<asp:Content ID="Content3" ContentPlaceHolderID="MainContent" runat="server"> 
    <% foreach(Contact c in Model) { %> 
     <% using(Html.BeginForm("UpdateContact", "Home")) { %> 
      <%=Html.EditorFor(x => c) %> 
      <input type="submit" value="save" /> 
     <% } %> 
    <% } %> 
</asp:Content> 

它使得編輯爲每個對象的名單,但所有的文本框具有相同的ID(「c_FirstName」和「c_LastName」每個「聯繫人」對象)。

而且這樣:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IList<Rpdc.Models.Contact>>" %> 
<asp:Content ID="Content4" ContentPlaceHolderID="MainContent" runat="server"> 
    <% using(Html.BeginForm("UpdateContact", "Home")) { %> 
     <%=Html.EditorForModel() %> 
     <input type="submit" value="save" /> 
    <% } %> 
</asp:Content> 

它呈現對象的列表,但只有一個保存按鈕提交的所有對象。 (Works,但它不是我所需要的)

是否有一種乾淨的方式來顯示對象列表的編輯器列表,每個對象都有一個單獨的「保存」按鈕,並且沒有元素具有重複的ID?

謝謝

回答

1

這是一種方法。你可以把表格編輯器中的模板,並覆蓋id來一些自定義的值,它是獨一無二的:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Rpdc.Models.Contact>" %> 

<% using(Html.BeginForm("UpdateContact", "Home")) { %> 
    FirstName: <%= Html.TextBoxFor(x => x.FirstName, new { id = Guid.NewGuid() }) %><br /> 
    SecondName: <%= Html.TextBoxFor(x => x.LastName, new { id = Guid.NewGuid() }) %><br />   
    <input type="submit" value="save" /> 
<% } %> 

而在你的主要觀點包括對模型中的每個元素編輯模板:

<% foreach (var contact in Model) { %> 
    <%= Html.EditorFor(x => contact) %> 
<% } %> 

,這將產生以下HTML:

<form action="/Home/UpdateContact" method="post"> 
    FirstName: <input id="4fe9e2cd-042d-4648-a7e7-5eca866fc6b4" name="contact.FirstName" type="text" value="fn1" /><br /> 
    SecondName: <input id="d28916ec-81a3-45f1-8bea-8aef7715ab86" name="contact.LastName" type="text" value="ln1" /><br /> 
    <input type="submit" value="save" /> 
</form> 
<form action="/Home/UpdateContact" method="post"> 
    FirstName: <input id="d8131dfa-2476-43f7-ad85-8e52d0b047bc" name="contact.FirstName" type="text" value="fn2" /><br /> 
    SecondName: <input id="4060649e-491d-4781-8108-5ba69ad4cea7" name="contact.LastName" type="text" value="ln2" /><br /> 
    <input type="submit" value="save" /> 
</form> 

正如你可以看到不同的ID用於每個輸入元素,但適當的名稱,以便默認模型綁定能拿ŧ

[HttpPost] 
public ActionResult UpdateContact(Contact contact) 
{ 
    return View(); 
} 

顯然這種方法,你可能需要添加一些隱藏的輸入字段編輯器模板包含聯繫人的唯一標識,所以在您的文章控制器動作,您知道哪些聯繫人是:他在POST動作值正在更新。

+0

Darin,感謝您的回覆,但有一個問題:在表單提交後,框架將從ModelState恢復輸入控件的值。現在,因爲所有文本框的名稱都是相同的,它們都會從提交的表單中接收該文本框的值。另外我想避免在編輯器模板中使用表單,我認爲一個簡單的用戶控件會更好地適應它。 – Vladikk 2010-10-18 18:50:31