2013-01-04 1 views
3

У меня есть модель представления с одним дочерним объектом и различными другими свойствами.Почему Html Helper добавляет префикс к атрибутам для модели дочерних элементов вида?

На мой взгляд, я хочу отобразить форму для дочернего объекта. Используя следующий код:

@Html.HiddenFor(model => model.Item.ItemID) 

производит следующий вывод:

<input id="Item_ItemID" name="Item.ItemID" type="hidden" value="234" /> 

Как вы можете видеть, помощник Html имеет приставку атрибуты id и name, в то время как я ожидал бы выход будет

<input id="ItemID" name="ItemID" type="hidden" value="234" /> 

Следовательно, предыдущий выход вызывает ошибку при отправке формы, поскольку элемент формы s не соответствуют свойствам дочернего объекта.

Я знаю, что могу обойти это жесткое кодирование скрытое поле

<input id="ItemID" name="ItemID" type="hidden" value="@Model.Item.ItemID" /> 

, какой вид побеждает разум за то, что Html помощников, или создавая частичный вид и переходящая в дочернем объекте

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

@Html.EditorFor(model => model.Item.Title) 
@Html.ValidationMessageFor(model => model.Item.Title) 

производит этот код:

<input class="text-box single-line" data-val="true" data-val-required="The Title field is required." id="Item_Title" name="Item.Title" type="text" value="Some text" /> 
<span class="field-validation-valid" data-valmsg-for="Item.Title" data-valmsg-replace="true"></span> 

поэтому должен быть элегантный способ сохранить имена свойств в синхронизации.

Может ли кто-нибудь ответить, почему HtmlHelper добавляет префикс к атрибутам для дочернего элемента модели представления? И как вопрос о последующих действиях, есть ли какой-либо другой опрятный способ предотвращения добавления префикса?

ответ

6

HTML-помощники построены с использованием условных условных обозначений. Так, например, я предполагаю, что у вас есть следующие модели:

public class MyViewModel 
{ 
    public ItemViewModel Item { get; set; } 

    // ... other properties 
} 

public class ItemViewModel 
{ 
    public int ItemID { get; set; } 
} 

и соответствующий вид сильно типизированных к MyViewModel.

Так что, когда вы используете:

@Html.HiddenFor(model => model.Item.ItemID) 

помощник генерирует:

<input id="Item_ItemID" name="Item.ItemID" type="hidden" value="234" /> 

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

[HttpPost] 
public ActionResult Process(MyViewModel model) 
{ 
    // model.Item.ItemID will be correctly bound here from the hidden field value 
} 

Я думаю, что ваши проблемы идут f рум тот факт, что ваши действия контроллера принимая ItemViewModel в качестве параметра вместо MyViewModel:

[HttpPost] 
public ActionResult Process(ItemViewModel model) 
{ 
    // model.ItemID will not be correctly bound here from the hidden field value 
} 

Таким образом, вы могли бы использовать атрибут [Bind] и указать префикс, чтобы помочь модели связующего:

[HttpPost] 
public ActionResult Process([Bind(Prefix="Item")] ItemViewModel model) 
{ 
    // model.ItemID will be correctly bound here from the hidden field value 
} 

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

Так как вы можете видеть в конце дня, вы могли бы прекрасно контролировать привязку модели, если будете правильно проектировать свои модели. Это все о моделях представлений в ASP.NET MVC. Они решают все проблемы.

+0

Спасибо @Darin. Вы были правы в том, что действие контроллера ожидало ItemViewModel. Добавление атрибута Bind позволило решить мою первоначальную проблему, не прибегая к каким-либо из моих обходных решений. – Webbie4

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