2012-01-20 3 views
2

Я написал частичный вид, который отображает список строк, где некоторые поля в строке редактируются с помощью текстового поля, флажка или что-то еще.Как сделать объемный упор на частичном представлении?

Я хотел бы, чтобы родительский вид имел кнопку «отправить», которая помещает всю коллекцию обновленных строк, чтобы я мог выполнять групповое обновление, а не публиковать один раз для каждой обновленной строки.

Вот что у меня есть:

public class GroupModel { 
    public string SomeGenericProperty { get; set; } 
    public IEnumerable<ItemModel> Items { get; set; } 
} 

public class ItemModel { 
    public long ID { get; set; } 
    public string Field1 { get; set; } 
    public string Field2 { get; set; } 
} 

Тогда у меня есть вид "GroupDetails":

@model MyNamespace.GroupModel 
... 
@using (Html.BeginForm("SaveItems", "Home")) { 
    <fieldset> 
    ... 
    @Html.Partial("ItemList", Model.Items) 
    ... 
    <input type="submit" value="Approve" /> 
    </fieldset> 
} 

И частичный вид "ITEMLIST":

@model IEnumerable<MyNamespace.ItemModel> 
<table> 
    <tr> 
    <th> 
     &nbsp; Field 1 &nbsp; 
    </th> 
    <th> 
     &nbsp; Field 2 &nbsp; 
    </th> 
    <th> 
    </th> 
    </tr> 
    @foreach (var item in Model) { 
    <tr> 
     <td> 
     &nbsp; 
     @Html.TextBoxFor(modelItem => item.Field1) 
     &nbsp; 
     </td> 
     <td> 
     &nbsp; 
     @Html.TextBoxFor(modelItem => item.Field2) 
     &nbsp; 
     </td> 
     <td> 
     @Html.HiddenFor(i => item.ID) 
     </td> 
    </tr> 
    } 
</table> 

Но когда я пост, информация с частичного просмотра не публикуется; GroupModel объект Items свойство - null.

Каков правильный способ сделать это?

ответ

4

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

Например, если вы посмотрите на исходный код вашей страницы вы увидите следующее:

<td> 
    &nbsp; 
    <input type="text" name="[0].Field1" id="[0]_Field1" /> 
    &nbsp; 
</td> 

вместо правильного имени, которое является:

<td> 
    &nbsp; 
    <input type="text" name="Items[0].Field1" id="Items[0]_Field1" /> 
    &nbsp; 
</td> 

Я бы порекомендовал вам чтения following blog post чтобы лучше понять формат провода, который ожидает связующее устройство по умолчанию.

Так начните фиксируя свой основной вид первой и заменить парциальное с шаблоном редактора:

@model MyNamespace.GroupModel 
@using (Html.BeginForm("SaveItems", "Home")) 
{ 
    <fieldset> 
     ... 

     <table> 
      <thead> 
       <tr> 
        <th>&nbsp; Field 1 &nbsp;</th> 
        <th>&nbsp; Field 2 &nbsp;</th> 
        <th></th> 
       </tr> 
      </thead> 
      <tbody> 
       @Html.EditorFor(x => x.Items) 
      </tbody> 
     </table> 

     ... 
     <input type="submit" value="Approve" /> 
    </fieldset> 
} 

, а затем определить пользовательский шаблон редактора, который будет показан для каждого элемента модели (~/Views/Shared/EditorTemplates/ItemModel.cshtml - это работает по соглашению, он должен быть либо внутри ~/Views/Shared/EditorTemplates, если вы хотите, чтобы он был повторно использован среди контроллеров или внутри ~/Views/Home/EditorTemplates, если вы хотите, чтобы этот шаблон был доступен только для Домашнего контроллера - и имя шаблона должно быть типом коллекции - в ваш случай ItemModel.cshtml):

@model MyNamespace.ItemModel 
<tr> 
    <td> 
     &nbsp; 
     @Html.TextBoxFor(x => x.Field1) 
     &nbsp; 
    </td> 
    <td> 
     &nbsp; 
     @Html.TextBoxFor(x => x.Field2) 
     &nbsp; 
    </td> 
    <td> 
     @Html.HiddenFor(x => x.ID) 
    </td> 
</tr> 

Теперь все будет связывать хорошо и денди~d в своем действии контроллера:

[HttpPost] 
public ActionResult SaveItems(GroupModel model) 
{ 
    ... 
} 
+2

шанс. Скорость, точность, ясность - это такие люди, как вы, которые делают StackOverflow таким незаменимым ресурсом. Спасибо большое! –

Смежные вопросы