Каков правильный подход к редактированию нескольких элементов в MVC 3? - PullRequest
1 голос
/ 21 февраля 2012

У меня есть базовый класс Product (свойства: int ProductID, имя строки, десятичная цена) и некоторые типы экземпляров, основанные на продукте, например, HardDisk с дополнительными свойствами.

Я экспериментирую с правками в одном представлении, модель которого основана на списке продуктов:

@model List<Product>

В этом представлении есть одно утверждение редактора:

@Html.EditorForModel(Model)

Я создал шаблон редактора для класса Product, который представляет собой отдельную форму Ajax, позволяющую пользователю редактировать имя для каждого продукта:

@model Product
@{
    // set unique IDs for result divs
    var resultDiv = "result" + Model.ProductID.ToString();
}
@using (Ajax.BeginForm("Update", new AjaxOptions
{
    HttpMethod = "POST",
    LoadingElementId = "working",
    UpdateTargetId = @resultDiv,
    InsertionMode = InsertionMode.Replace
}
))
{
    <div style="padding: 4px; margin-bottom: 4px; border: 1px solid gray; background-color: #eee;">
        @Html.HiddenFor(m => m.ProductID)
        @Html.DisplayFor(m => m.Name)
        @Html.LabelFor(m => m.Name)
        @Html.EditorFor(m => m.Name)
        <input type="submit" value="Save" />
        <span id="@resultDiv">...</span>
    </div>

}

Это прекрасно работает для первой строки (с идентификатором [0] .Name), которая отправит данные с одной записью. Однако редактирование второй или третьей строки приводит к нулевым данным в записи.

Ответы [ 3 ]

2 голосов
/ 21 февраля 2012

вы должны взглянуть на следующую статью

Привязка модели к списку

1 голос
/ 21 февраля 2012

Выяснили причину и решение здесь - было полезно прочитать ссылку «Привязка модели к списку».

Проблема здесь в том, что связыватель модели предполагает, что индекс будет начинаться с нуля и продолжаться.Сгенерированные имена для каждого элемента следуют этому шаблону:

[0].ProductID, [0].Name
[1].ProductID, [1].Name
[2].ProductID, [2].Name

Однако, поскольку я использовал одну форму AJAX для отправки каждой записи, связыватель модели мог создать действительный список из индекса, только если я отредактировалпервый элемент ([0]).

Если я отредактировал второй элемент, в записи формы были только значения для [1] .ProductId и [1] .Name - так что это не был индекс, начинающийся с нуля- поэтому связыватель не смог воссоздать данные продукта - отсюда и нулевое значение.

Мое решение состояло в том, чтобы обработать POST таким, какой он есть на самом деле, - одним редактированием одного объекта.Чтобы сделать это, мне нужно было изменить атрибут «name» в каждом элементе управления на «ProductID» и «Name», а затем изменить метод Update, который обрабатывает POST, чтобы ожидать один тип продукта.

Это сработалоидеально.

0 голосов
/ 21 февраля 2012

нам нужно предоставить индекс для каждого элемента, чтобы связать сложные объекты.

<% for (int i = 0; i < Product.count; i++) { %>

 <%: Html.HiddenFor(m => m[i].ProductID) %>

  <%: Html.TextBoxFor(m => m[i].Name) %>

<%: Html.TextBoxFor(m => m[i].Price) %> 

<% } %>

Если вы используете шаблонные помощники, используйте шаблон, как показано ниже на главной странице

<% for (int i = 0; i < Product.count; i++) { %>

  <%: Html.EditorFor(m => m[i]) %>

<% } %>

В Product.ascx (страница шаблона или помощник по шаблону)

 <%@ Control Inherits="ViewUserControl<Product>" %>

 <%: Html.HiddenFor(m => m[i].ProductID) %>

      <%: Html.TextBoxFor(m => m[i].Name) %>

    <%: Html.TextBoxFor(m => m[i].Price) %>
...