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);
}

Так что модель хорошо обновляется дважды. Второй раз для вашего частичного.

Другие вопросы по тегам