ASP.MVC 3 Razor Добавить префикс модели в расширении Html.PartialView - PullRequest
6 голосов
/ 04 февраля 2011

У меня почти все тот же вопрос, что и у него Частичные представления 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 ]

12 голосов
/ 08 февраля 2011

Попробуйте это расширение:

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 } });
        }
10 голосов
/ 04 февраля 2011

Вместо использования Html.RenderPartial() поместите частичное представление в Shared / EditorTemplates / и назовите его именем типа (в данном случае ZipCodeViewModel). Затем вы можете использовать Html.EditorFor(), передавая выражение для свойства. EditorFor () правильно ставит префиксы в поля, чтобы связыватель модели в MVC мог правильно разместить ваши данные.

Так что-то вроде этого

@model UserViewModel
.....
@Html.EditorFor(m => m.ZipCode);

Я попытаюсь найти некоторые ссылки и ресурсы, но хотел бы получить ответ для вас.

EDIT : Кажется, что в этом блоге рассматриваются основы расширения 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() ставит перед вами префиксы имен, так что он может в основном отображать частичное представление, которое отправит данные обратно, которые могут быть связаны для вас. Хотя вы можете сами установить атрибуты имени для элементов ввода (или сгладить все, как вы предлагали в комментариях), эти помощники помогут вам сделать это.

Надеюсь, это поможет объяснить, что происходит, и возможное решение для вас.

0 голосов
/ 25 ноября 2012

Как оказалось, 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). Работает как магия.

0 голосов
/ 21 сентября 2011

Вы можете следующий код:

ActionResult MyAction(UserViewModel model)
{
    TryUpdateModel(model.ZipCode);
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...