asp.net mvc: использование шаблонов редактора для обновления списка объектов - PullRequest
0 голосов
/ 18 октября 2010

Я бьюсь головой об стену в течение некоторого времени, некоторая помощь будет высоко оценена:

Допустим, у меня есть простая модель:

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

И простой редакторTemple:

<%@ 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>

Он отображает список редакторов для каждого объекта, но все текстовые поля имеют идентичные идентификаторы («c_FirstName» и «c_LastName» для каждого объекта «Контакт»).1012 *

И так:

<%@ 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>

Он отображает список объектов, но только с одной кнопкой сохранения, которая передает все объекты.(Работает, но это не то, что мне нужно)

Есть ли чистый способ отображения списка редакторов для списка объектов, с отдельной кнопкой «сохранить» для каждого из них и без элементов, имеющих повторяющиеся идентификаторы?

Спасибо

1 Ответ

1 голос
/ 18 октября 2010

Вот один из способов сделать это. Вы можете поместить форму в шаблон редактора и переопределить идентификатор на какое-то пользовательское значение, чтобы оно было уникальным:

<%@ 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>

Как видите, для каждого элемента ввода используются разные идентификаторы, но собственные имена, чтобы связыватель модели по умолчанию мог получить значения в действии POST:

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

Очевидно, что при таком подходе вам может понадобиться добавить в шаблон редактора скрытое поле ввода, содержащее уникальный идентификатор контакта, чтобы в действии контроллера POST вы знали, какой контакт обновляется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...