Ok ich eine Abhilfe dazu gefunden haben, durch eine neue Eigenschaft der Klasse hinzufügen:
public bool AddressIsRequired { get; set; }
Ich konnte dies gesetzt, wenn für verschiedene Formen mein Modell zu bauen und dann stattdessen das normale erforderliche Attribut zu verwenden, ich meine eigene benutzerdefinierte Validator gemacht:
[AttributeUsage(AttributeTargets.Property, AllowMultiple = true, Inherited = true)]
public sealed class AddressRequiredAttribute : RequiredAttribute, IClientValidatable
{
public AddressRequiredAttribute()
: base()
{
}
protected override ValidationResult IsValid(object value, ValidationContext context)
{
Type addresType = typeof(AddressModel);
if (context.ObjectType == addresType || context.ObjectType.BaseType == addresType)
{
AddressModel baseModel = (AddressModel)context.ObjectInstance;
if (baseModel != null && baseModel.AddressIsRequired)
{
return base.IsValid(value, context);
}
}
return ValidationResult.Success;
}
}
Und dann in meiner AddressModel konnte ich meine Eigenschaften als solche markieren:
[AddressRequired(ErrorMessage = "Please enter your Postcode")]
public string Postcode { get; set; }
Ich werde dies offen lassen, wenn jemand in der Lage ist, eine bessere Möglichkeit zu finden, dies zu tun (dh in der Lage, einfach die Daten-Annotation zu ändern, ohne ein separates Attribut zu machen). Diese Vorgehensweise bedeutet auch, dass die Eigenschaften, die mit diesem Attribut markiert sind, immer dann als erforderlich markiert werden, wenn Sie das Label für den Helper erweitern und die Metadaten zum Überprüfen des IsRequired-Flags verwenden (ich denke, dies könnte daran liegen, dass es vom erforderlichen Attribut erbt).
Ja ... Ich benutze dies in MVC die ganze Zeit, was ist das Problem? Wie verarbeitet man das Attribut? – Coops
Ich habe das Adressmodell, das auf den meisten Formularen nicht benötigt wird, aber auf einem Formular, wo wir Broschüren verschicken, ist es erforderlich, also muss ich eine '[Required (ErrorMessage = "Bitte geben Sie Ihre Postleitzahl ein])' 'zur Basisklasse hinzufügen aber nur für dieses eine Formular - ich möchte nicht ein neues Adressmodell nur dafür machen müssen, da es seine eigenen Partial verwendet, um ein Ajax AutoFilling zu machen – Pete
"... also muss ich ein [Required (ErrorMessage = "Bitte geben Sie Ihre Postleitzahl ein")] an die Basisklasse, aber nur für dieses eine Formular ... "Basisklasse ist für 'überall'. Funktioniert Ihr vorgeschlagener Ansatz nicht? – Coops