Шаблон редактора, не являющийся обязательным в классе MVC3

#asp.net #asp.net-mvc-3 #razor

#asp.net #asp.net-mvc-3 #razor

Вопрос:

Привет, у меня есть класс PersonName, который выглядит следующим образом:

  public class PersonName
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string MiddleName { get; set; }
    }
  

У меня есть UserCreateModel, который состоит из PersonName среди других свойств, подобных этому:

   public class UserCreateModel
    {

        public PersonName FullName { get; set; }               
        public string UserName { get; set; }
        ...........
    }
  

У меня есть шаблон редактора в / Views/Shared/EditorTemplates/PersonName.cshtml, который выглядит следующим образом (урезан):

 @model PersonName

First: @Html.EditorFor(m => m.FirstName) 
Last: @Html.EditorFor(m => m.LastName) 
Middle: @Html.EditorFor(m => m.Middle)
  

Однако, когда я делаю (короткая версия) :

 @model UserCreateModel
 @{Html.BeginForm("Create", "User");}
        @Html.EditorForModel()  
 @{Html.EndForm();}
  

Имя пользователя не привязывается к редактору и вообще не отображается. Я даже пробовал UIHint, но не уверен, чего мне не хватает. Также как мне отладить эту проблему?

Пожалуйста, помогите!

Ответ №1:

У вас есть шаблон редактора для PersonName класса ( ~/Views/Shared/EditorTemplates/PersonName.cshtml ), но не для UserCreateModel , который является вашей основной моделью. Итак, вам нужно либо написать шаблон редактора для UserCreateModel класса и использовать EditorForModel , либо указать свойство using EditorFor следующим образом:

 @model UserCreateModel
@using(Html.BeginForm("Create", "User"))
{
    @Html.EditorFor(x => x.FullName)  
}
  

Комментарии:

1. Спасибо, Дарин, я попробую это сейчас. Но разве объект по умолчанию.cshtml не должен отображать эту модель и рекурсивно извлекать элементы в базе UserCreateModel на основе UIHint или типа данных и отображать соответственно? Я спрашиваю, потому что другие строковые свойства в классе, такие как электронная почта, работают нормально. Имеет ли это отношение к TemplateDepth в реализации по умолчанию? Извините, я новичок в MVC, поэтому, возможно, я упускаю очевидное.

2. Спасибо, это сработало. Хотя я не уверен, почему он не был рекурсивно подобран — Сообщение в блоге Брэда Уилсона, похоже, намекает на глубокую привязку.

Ответ №2:

Если это точный код, который вы используете, я думаю, вам следует изменить Model в lambda на m

     @model PersonName

First: @Html.EditorFor(m => m.FirstName) 
Last: @Html.EditorFor(m => m.LastName) 
Middle: @Html.EditorFor(m => m.Middle)
  

и не модель.Имя пользователя и т. Д

Комментарии:

1. Спасибо @archil, да, это m.FirstName. Исправил это в исходном сообщении. Виноват. Но проблема не в этом.

2. -1. Вероятно, это должен был быть комментарий; вы не даете никакого реального ответа на проблему OP.

Ответ №3:

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

http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-4-custom-object-templates.html

надеюсь, это поможет вам