我的ViewModel中的一个属性不会填充ModelMetadata

时间:2011-11-10 08:36:25

标签: asp.net-mvc-3

我在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调用以查看可能发生的事情。

有关下一个地方的想法吗?

1 个答案:

答案 0 :(得分:0)

所以问题出在控制器动作中,出于无关的原因,使用“FamilyName”作为ViewData值:

     ViewBag.FamilyName = familyName;

这导致在具有相同名称的模型字段的映射中破裂 - 也就是说,ModelMetadata不会传播。因此,经验教训是:不要为视图模型中的字段赋予ViewData字典项密钥。