ASP.NET MVC ModelMetaData: Gibt es eine Möglichkeit IsRequired zu basierend auf der RequiredAttribute?

StackOverflow https://stackoverflow.com/questions/1662442

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.

War es hilfreich?

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();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top