我在ASP.NET MVC3视图模型的发布方式中遇到了非常奇怪的行为 - 对于一个字段,ModelMetadata不会传播。我在Brad Wilson之后使用模板化助手,虽然为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
&& !ViewData.TemplateInfo.Visited(pm)
&& 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”除外),也不能指定控件的ID等。
Street和DateStarted正常发出,带有ID和all。所以我完全不知道为什么一个属性无法设置ViewData属性 - 我也不知道如何逐步通过Html.Display调用以查看可能发生的事情。
有关下一个地方的想法吗?
答案 0 :(得分:0)
所以问题出在控制器动作中,出于无关的原因,使用“FamilyName”作为ViewData值:
ViewBag.FamilyName = familyName;
这导致在具有相同名称的模型字段的映射中破裂 - 也就是说,ModelMetadata不会传播。因此,经验教训是:不要为视图模型中的字段赋予ViewData字典项密钥。