2009-11-02 2 views
13

Brad Wilson hat eine große Blog-Serie auf neue ModelMetaData des ASP.NET MVC: http://bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-2-modelmetadata.htmlASP.NET MVC ModelMetaData: Gibt es eine Möglichkeit, IsRequired basierend auf dem RequiredAttribute festzulegen?

Darin beschreibt er, wie die ModelMetaData Klasse jetzt in den Ansichten und Templat Helfern ausgesetzt ist. Was ich tun möchte, ist ein Sternchen neben einer Formularfeldbeschriftung anzuzeigen, wenn das Feld erforderlich ist, also habe ich über die Verwendung der IsRequired-Eigenschaft von ModelMetaData nachgedacht. IsRequired ist jedoch standardmäßig für alle nicht nullwertfähigen Eigenschaften wahr, während es für alle Nullable-Eigenschaften false ist. Das Problem besteht darin, dass Strings immer nullfähig sind, sodass die IsRequired-Eigenschaft für Strings immer falsch ist. Weiß jemand, wie der Standardwert von IsRequired überschrieben wird? Alternativ habe ich darüber nachgedacht, das RequiredAttribute-Attribut zu verwenden, mit dem ich meine Eigenschaften dekorierte, aber das RequiredAttribute scheint nicht über die ModelMetaData-Klasse verfügbar gemacht zu werden. Weiß jemand, wie man dieses Problem umgehen kann?

Vielen Dank im Voraus.

Antwort

17

Sie müssen Ihren eigenen ModelMetadataProvider erstellen. Hier ist ein Beispiel der 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; 
     } 
} 

Dann in Ihrem AppStartup in Global.asax verwenden, sollten Sie die folgenden in setzen die MyMetadataProvider als Standard-Metadaten-Provider hookup:

ModelMetadataProviders.Current = new MyMetadataProvider(); 
+0

Dank. Das ist genau die Art von Lösung, nach der ich gesucht habe. Ich kann jedoch nicht scheinen, dass dies richtig funktioniert. Auch durch meine Eigenschaft ist mit RequiredAttribute dekoriert und es wird ordnungsgemäß in der Liste "Attribute" in CreateMetadata(), attributes.Where (x => x.Equals (typeof (RequiredAttribute))) gibt eine leere Liste, die zu IsRequired führt immer noch falsch. Ist etwas falsch, das ich mit diesem Lambda-Ausdruck mache? –

+3

"x.Equals (typeof (RequiredAttribute))" sollte lesen "x ist RequiredAttribute". * x * ist eine Instanz eines Attributs, nicht der Typ des Attributs. – Levi

+0

Danke Zowens und Levi. Mein Problem ist jetzt gelöst. –