2009-11-02 27 views
13

布拉德·威爾遜張貼在ASP.NET MVC的新ModelMetaData一個偉大的博客系列: http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-2-modelmetadata.htmlASP.NET MVC ModelMetaData:有沒有基於RequiredAttribute設置IsRequired的方法?

在書中,他描述瞭如何ModelMetaData類的意見和模板助手,現在暴露出來。我想要做的是在表單字段標籤旁邊顯示星號(如果該字段是必需的),所以我想過使用ModelMetaData的IsRequired屬性。但是,默認情況下IsRequired對所有不可爲null的屬性都爲true,對於所有可爲null的屬性則爲false。問題是,字符串始終爲空,所以對於字符串,IsRequired屬性始終爲false。有誰知道如何覆蓋如何設置IsRequired的默認值?或者,我想過利用RequiredAttribute屬性來裝飾我的屬性,但RequiredAttribute似乎沒有通過ModelMetaData類公開。有誰知道如何解決這個問題?

在此先感謝。

回答

17

您需要創建自己的ModelMetadataProvider。下面是一個使用DataAnnotationsModelBinder

public class MyMetadataProvider : DataAnnotationsModelMetadataProvider 
{ 
     protected override ModelMetadata CreateMetadata(Collections.Generic.IEnumerable<Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName) 
     { 
      var _default = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName); 
      _default.IsRequired = attributes.Where(x => x is RequiredAttribute).Count() > 0; 
      return _default; 
     } 
} 

然後在Global.asax中的AppStartup,你會希望把下面來裝MyMetadataProvider爲默認的元數據提供程序的示例:

ModelMetadataProviders.Current = new MyMetadataProvider(); 
+0

感謝。這正是我所尋找的解決方案。但是,我似乎無法讓這個工作正常。即使通過我的屬性裝飾了RequiredAttribute,它在CreateMetadata()的「屬性」列表中正確顯示,屬性.Where(x => x.Equals(typeof(RequiredAttribute)))返回一個空列表,這會導致IsRequired仍然是假的。這個lambda表達式有什麼問題嗎? – 2009-11-03 05:09:42

+3

「x.Equals(typeof(RequiredAttribute))」應爲「x是RequiredAttribute」。 * x *是一個屬性的實例,而不是屬性的類型。 – Levi 2009-11-03 08:53:53

+0

謝謝Zowens和Levi。我的問題現在已經解決了。 – 2009-11-03 16:24:19

相關問題