ASP.NET MVC ModelMetaData: Gibt es eine Möglichkeit IsRequired zu basierend auf der RequiredAttribute?
-
12-09-2019 - |
Frage
Brad Wilson hat eine große Blog-Serie auf ASP.NET MVC neue ModelMetaData: http: //bradwilson.typepad .com / blog / 2009/10 / aspnet-mvc-2-Vorlagen-Teil-2-modelmetadata.html
Darin beschreibt er, wie die ModelMetaData Klasse jetzt in den Ansichten und Templat Helfer ausgesetzt ist. Was ich möchte, ist zu tun, neben einem Formularfeld Etikett ein Sternchen angezeigt werden, wenn das Feld erforderlich ist, so dachte ich über die IsRequired Eigenschaft ModelMetaData verwenden. Allerdings ist IsRequired standardmäßig gilt für alle Nicht-Nullable-Eigenschaften, während es für alle auf NULL festlegbare Eigenschaften falsch ist. Das Problem ist, Strings sind immer nullable, so dass die IsRequired Eigenschaft ist immer falsch für Streicher. Wer weiß, wie die Standardeinstellung außer Kraft zu setzen, wie IsRequired eingestellt ist? Alternativ dachte ich über das RequiredAttribute Attribut nutzen, die ich mit meinen Eigenschaften Dekoration habe, aber die RequiredAttribute scheint nicht durch die ModelMetaData Klasse ausgesetzt werden. Weiß jemand, wie dieses Problem zu bekommen?
Vielen Dank im Voraus.
Lösung
Sie müssen Ihre eigenen ModelMetadataProvider erstellen. Hier ist ein Beispiel für die DataAnnotationsModelBinder mit
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, werden Sie die folgenden um hookup die MyMetadataProvider als Standard-Metadaten-Anbieter zu setzen:
ModelMetadataProviders.Current = new MyMetadataProvider();