2011-11-10 88 views
0

我遇到了一個ASP.NET MVC3視圖模型發出的方式非常奇怪的行爲 - 對於一個字段,ModelMetadata不傳播。我在Brad Wilson之後使用模板助手,雖然更新了Razor。這裏是我的視圖模型:從我的ViewModel的一個屬性將不會填充ModelMetadata

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根本不會被填充。因此,該模板無法顯示標籤(「字符串」除外),也不會分配控件的ID等。

Street和DateStarted通常會發出ID和全部。所以我完全不知道爲什麼這個屬性不能設置ViewData屬性 - 我也不知道如何逐步通過Html.Display調用來查看可能發生的事情。

想要下一個地方的任何想法?

回答

0

所以,問題是在控制器動作,這對於不相關的原因,使用「FamilyName」的ViewData的值:

 ViewBag.FamilyName = familyName; 

這導致所有赫克打破模型領域具有相同的映射鬆名稱 - 即ModelMetadata不會傳播。因此,課程是:不要爲您的視圖模型中的ViewData字典項目鍵名稱與字段相同。

相關問題