ASP.MVC 3 Razor Добавить модель префикса в расширении Html.PartialView
У меня есть почти все тот же вопрос, что и его частичные представления ASP.NET MVC: префиксы ввода имени
Я пытаюсь создать операции CRUD для этих объектов данных:
public class UserViewModel
{
protected virtual Id {get; set;}
public virtual string Login { get; set; }
public virtual string Password { get; set; }
public virtual ZipCodeViewModel ZipCode { get; set; }
}
Почтовый индекс лица:
public class ZipCodeViewModel
{
public virtual string City { get; set; }
public virtual string State { get; set; }
public virtual string Zip { get; set; }
}
У меня также есть частичный вид ZipCode, который использовал UserViewModel.ZipCode:
@model ZipCodeViewModel
@Html.TextBoxFor(x => x.Zip, new { id = "ZipCode", name = "ZipCode.Zip", maxlength = "5" })
Я собираюсь использовать ZipCodePartialView на другой странице (например, пользователь).
@model UserViewModel
.....
@{Html.RenderPartial("Zipcode", Model.ZipCode);}
При сохранении MVC поле User ZipCode Zip пусто.
Итак, вопрос в том, как я могу добавить префикс модели в Patrial View?
4 ответа
Попробуйте это расширение:
public static void RenderPartialWithPrefix(this HtmlHelper helper, string partialViewName, object model, string prefix)
{
helper.RenderPartial(partialViewName,
model,
new ViewDataDictionary { TemplateInfo = new System.Web.Mvc.TemplateInfo { HtmlFieldPrefix = prefix } });
}
Вместо того, чтобы использовать Html.RenderPartial()
поместите ваше частичное представление в Shared/EditorTemplates/ и назовите его именем типа (в данном случае ZipCodeViewModel
). Тогда вы можете использовать Html.EditorFor()
передавая выражение для свойства. EditorFor() правильно добавляет префиксы к полям, чтобы механизм связывания моделей в MVC мог правильно разместить ваши данные.
Так как то так
@model UserViewModel
.....
@Html.EditorFor(m => m.ZipCode);
Я попытаюсь найти некоторые ссылки и ресурсы, но хотел бы получить ответ для вас.
РЕДАКТИРОВАТЬ: Это сообщение в блоге, кажется, идет по основам расширения EditorFor () и EditorTempaltes: краткие советы о ASP.NET MVC: Tempaltes редактора
Во всяком случае, когда вы используете эти Html.TextBoxFor()
или же Html.DropDownFor()
расширения, они получают полное имя свойства из передаваемого вами выражения и устанавливают для него атрибуты name и id входного HTML-элемента. Примером может быть:
@Html.TextBoxFor(m => m.Person.FirstName)
будет оказывать
<input id="Person_FirstName" name="Person.FirstName" type="text" value="<what ever was in FirstName>" />
Эти входные имена и значения являются парами ключ / значение в данных поста. Механизм связывания модели ASP.NET MVC по умолчанию пытается сопоставить эти ключи с моделями, в которых используются действия вашего контроллера. Если он может найти совпадение, он устанавливает значение.
Так что ваша проблема выше, вероятно, потому что входные имена в вашем частичном представлении от ZipCodeViewModel
вниз, но ваше действие принимает в UserViewModel
, EditorFor()
префиксы имен для вас, так что он может в основном визуализировать частичное представление, которое отправит данные обратно, которые могут быть связаны для вас. Хотя вы можете сами установить атрибуты имени для элементов ввода (или сгладить все, как вы предлагали в комментариях), эти помощники помогут вам сделать это.
Я надеюсь, что это поможет объяснить, что происходит, и возможное решение для вас.
Как оказалось, EditorTemplates - это путь. (первый комментарий к этому сообщению: http://thatextramile.be/blog/2011/01/prefixing-input-elements-of-partial-views-with-asp-net-mvc)
Просто добавьте ZipCodeViewModel.cshtml в папку EditorTemplates, которая может находиться внутри Views/Shared, если вы хотите. Затем используйте @Html.EditorFor(m => m.ZipCode). Работает как магия.
Вы можете следующий код:
ActionResult MyAction(UserViewModel model)
{
TryUpdateModel(model.ZipCode);
}
Так что модель хорошо обновляется дважды. Второй раз для вашего частичного.