одно свойство из моей ViewModel не будет заполнять ModelMetadata

#asp.net-mvc-3

#asp.net-mvc-3

Вопрос:

Я испытываю очень странное поведение в том, как ASP.NET Выдается модель представления MVC3 — для одного поля ModelMetadata не распространяется. Я использую шаблонные помощники после Брэда Уилсона, хотя и обновленные для Razor. Вот моя модель представления:

 public class FamilyBaseViewModel : ViewModelBase
{
    [Display(Order = 10)]
    public string FamilyName { get; set; }

    [Display(Order = 30)]
    [StringLength(50, ErrorMessage = "Street name can only be 50 characters long.")]
    public string Street { get; set; }
}

public class FamilyPrivateViewModel : FamilyBaseViewModel
{
    [Display(Name = "Date Started", Order = 20)]
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:d}")]
    [DataType(DataType.Date)]
    public DateTime? DateStarted { get; set; }
}
  

Шаблон object.cshtml просматривает свойства и использует Html.Display для их отображения:

 // object.cshtml
 <ol>
            @foreach (var prop in
            ViewData.ModelMetadata.Properties.Where(pm => pm.ShowForDisplay
                            amp;amp; !ViewData.TemplateInfo.Visited(pm)
                            amp;amp; pm.ModelType != typeof(System.Data.EntityState)))
            {
                <li>
                @Html.Display(prop.PropertyName)
                </li>
            }
        </ol>
  

В приведенном выше сценарии все три поля имеют правильные дескрипторы в вызове object.cshtml (prop.DisplayName, prop.TemplateHint), но когда первое свойство — FamilyName — передается в String.cshtml, ViewData.ModelMetadata вообще не заполняется. В результате шаблон не может отображать метку (кроме «String»), а также назначать идентификатор элемента управления и т.д.

Street и dateStarted выводятся нормально, с идентификатором и всеми. Итак, я совершенно не понимаю, почему свойство one не сможет установить свойства ViewData — и я не знаю, как пройти мимо вызова Html.Display, чтобы увидеть, что может происходить.

Есть идеи, где искать в следующий раз?

Ответ №1:

Итак, проблема заключалась в действии контроллера, который по несвязанным причинам использовал «FamilyName» для значения ViewData:

      ViewBag.FamilyName = familyName;
  

И это привело к тому, что все, черт возьми, нарушилось при отображении полей модели с тем же именем — то есть ModelMetadata не будет распространяться. Итак, урок таков: не давайте элементам словаря ViewData ключи с тем же именем, что и поле в вашей модели представления.