#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 ключи с тем же именем, что и поле в вашей модели представления.