2014-12-05 6 views
0

Я пытаюсь создать редактор в ASP.NET MVC 2 для списка флажков. Набор этих флажков основан на таблице базы данных. У меня возникли проблемы с получением имен, чтобы выйти правильно, так что значения поста ...привязка вложенного списка модели и HTML-помощники

ViewModels:

public class EAF 
{ 
    // other properties 
    public IEnumerable<ProductViewModel> _products { get; set; } 
} 

public class ProductViewModel 
{ 
    public int ProductPK { get; set; } 
    public string ProductName { get; set; } 
    public bool IsSelected { get; set; } 
} 

Главного Вид:

<%: Html.EditorFor(m => m._products, "ProductListTemplate") %> 

Редактор шаблонов (список):

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IList<EmployeeAccessForm.Models.ProductViewModel>>" %> 

<fieldset> 
<legend>REQUEST FOR: (select item(s) to display access form)</legend> 
<table> 
    <tr> 
<% for (int i = 0; i < Model.Count(); i++) { %> 
    <td> 
    <%: Html.EditorFor(model => model[i], "ProductCheckBox") %> 
    </td> 
    <% if (i+1 % 5 == 0) { %> 
     </tr> 
     <tr> 
    <% } %> 
<% } %> 
    </tr> 
</table> 
</fieldset> 

редактор шаблона (пункт):

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

<%: Html.HiddenFor(model => model.ProductPK)%> 
<%: Html.CheckBoxFor(model => model.IsSelected)%> 
<%: Html.DisplayTextFor(model => model.ProductName)%> 

Я получаю таблицу флажков, как и ожидалось, но когда я просматриваю источник, все входы имеют имя _products.[0].ProductPK, где мне нужно, чтобы оно было _products[0].ProductPK (без первой точки). Есть ли способ использовать помощников, чтобы получить имена, которые выходят, как последний? Я могу сделать это, написав HTML явно, но задавался вопросом, могу ли я по-прежнему использовать помощники и получить правильное имя.

+0

Я редактировал свой титул. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

+0

Спасибо за подсказку. – Mike

ответ

1

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

<%: Html.EditorFor(m => m._products, "ProductListTemplate") %> 

Это приводит к префиксу добавляемого в _products. Затем в вашем шаблоне списка имена полей там связаны в форме [0].ProductPK. Таким образом, результат _products.[0].ProductPK.

Вместо в главном окне вы должны делать:

<fieldset> 
<legend>REQUEST FOR: (select item(s) to display access form)</legend> 
<table> 
    <tr> 
<% for (int i = 0; i < Model.Count(); i++) { %> 
    <td> 
    <%: Html.EditorFor(model => model._products[i], "ProductCheckBox") %> 
    </td> 
    <% if (i+1 % 5 == 0) { %> 
     </tr> 
     <tr> 
    <% } %> 
<% } %> 
    </tr> 
</table> 
</fieldset> 

Другими словами, удалить, что средний слой, который завинчивание имена полей. Поскольку переданное здесь выражение model._products[i], ваши имена полей будут иметь префикс _products[0].

Если ваша цель с шаблоном списка была просто повторно использовать эту часть зрения, вы можете сделать это, но модель вы передаете в должна быть вашим EAF классом, а затем вы будете использовать Html.Partial вместо Html.EditorFor:

<%: Html.Partial("ProductListTemplate") %> 

ProductListTemplate.cshtml

@model Namespace.To.EAF 

... 

<%: Html.EditorFor(model => model._products[i], "ProductCheckBox") %> 
+0

Для ясности я добавил фрагмент о том, как выглядел основной вид. И ваше предложение отлично работало с частичным представлением плюс модель EAF вместо шаблона редактора! Спасибо за вашу помощь! – Mike