Frage

In der Welt des MVC Ich habe diese Ansicht Modell ...

public class MyViewModel{

[Required]
public string FirstName{ get; set; }    }

... und diese Art der Sache meiner Meinung nach ...

<%= Html.ValidationSummary("Please correct the errors and try again.") %>
<%= Html.TextBox("FirstName") %>
<%= Html.ValidationMessage("FirstName", "*") %>

Meine Frage: Wenn ich dieses Formular abgesendet hat, ohne einen Namen zu liefern, erhalte ich die folgende Meldung „Das Feld Vorname ist erforderlich“

OK. Also, ich gehe und mein Eigentum ändern ...

[DisplayName("First Name")]
[Required]
public string FirstName{ get; set; }    

.. und jetzt bekommen „Der Vorname ist erforderlich“

Alles war gut bis jetzt.

So nun möchte ich die Fehlermeldung „Vorname Blah Blah“ anzuzeigen. Wie kann ich die Standard-Nachricht überschreiben Display + „Blabla“, wihtout Kommentierung alle Eigenschaften mit so etwas wie

anzuzeigen
[Required(ErrorMessage = "First Name Blah Blah")]

Cheers,

ETFairfax

War es hilfreich?

Lösung

public class GenericRequired: RequiredAttribute
{
    public GenericRequired()
    {
        this.ErrorMessage = "{0} Blah blah"; 
    }
}

Andere Tipps

Hier ist ein Weg, um es ohne Subclassing RequiredAttribute zu tun. So stellen Sie einige Attribute Adapterklassen. Hier bin ich mit ErrorMessageResourceType / ErrorMessageResourceName (mit einer Ressource), aber man konnte leicht eingestellt ErrorMessage oder sogar überprüfen für die Existenz von Überschreibungen, bevor diese Einstellung.

Global.asax.cs:

public class MvcApplication : HttpApplication {
    protected void Application_Start() {
        // other stuff here ...
        DataAnnotationsModelValidatorProvider.RegisterAdapter(
            typeof(RequiredAttribute), typeof(CustomRequiredAttributeAdapter));
        DataAnnotationsModelValidatorProvider.RegisterAdapter(
            typeof(StringLengthAttribute), typeof(CustomStringLengthAttributeAdapter));
    }
}

private class CustomRequiredAttributeAdapter : RequiredAttributeAdapter {
    public CustomRequiredAttributeAdapter(ModelMetadata metadata, ControllerContext context, RequiredAttribute attribute)
        : base(metadata, context, attribute)
    {
        attribute.ErrorMessageResourceType = typeof(Resources);
        attribute.ErrorMessageResourceName = "ValRequired";
    }
}

private class CustomStringLengthAttributeAdapter : StringLengthAttributeAdapter {
    public CustomStringLengthAttributeAdapter(ModelMetadata metadata, ControllerContext context, StringLengthAttribute attribute)
        : base(metadata, context, attribute)
    {
        attribute.ErrorMessageResourceType = typeof(Resources);
        attribute.ErrorMessageResourceName = "ValStringLength";
    }
}

In diesem Beispiel würden Sie eine Ressourcendatei Resources.resx mit ValRequired als neuer erforderlichen Standardmeldung und ValStringLength als die Stringlänge überschritt Standardmeldung genannt erstellen. Beachten Sie, dass für beide, {0} erhält den Namen des Feldes, das Sie mit [Display(Name = "Field Name")] einstellen können.

Es scheint, dass RequiredAttribute IClientValidatable nicht implementiert, so dass, wenn Sie die RequiredAttribute außer Kraft setzen es Client-seitige Validierung bricht.

Das ist also, was ich tat und es funktioniert. Hoffe, das hilft jemand.

public class CustomRequiredAttribute : RequiredAttribute, IClientValidatable
{
    public CustomRequiredAttribute()
    {
        this.ErrorMessage = "whatever your error message is";
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        yield return new ModelClientValidationRule
        {
            ErrorMessage = this.ErrorMessage,
            ValidationType = "required"
        };
    }
}

Just ändern

[Required] 

[Required(ErrorMessage = "Your Message, Bla bla bla aaa!")]

Edit: Ich gepostet, weil ich für diese Lösung mit [Erforderlich] Attribute suchen und hatte Problem, es zu finden. Erstellen neuer Q / A sehen nicht so gut, da diese Frage bereits vorhanden ist.

Ich habe versucht, die gleiche Sache zu lösen, und ich fand sehr einfache Lösung in MVC 4.

Zuerst würden Sie wahrscheinlich Fehlermeldungen in einem Ort zu speichern haben. Ich verwenden, um benutzerdefinierte Ressourcen, gut beschrieben unter http://afana.me/post/aspnet-mvc -internationalization.aspx .

Wichtig ist, dass ich jede Ressource bekommen (auch Fehlermeldung) einfach durch Aufruf von ResourcesProject.Resources.SomeCustomError oder ResourcesProject.Resources.MainPageTitle usw. Jedesmal, wenn ich den Zugriff auf Ressourcen-Klasse, dauert es Kulturinfos von aktuellen Thread und richtige Sprache zurückgibt.

Ich habe Fehlermeldung für Feldvalidierung in ResourcesProject.Resources.RequiredAttribute . Um diese Meldung zu setzen in Aussicht erscheinen, einfach aktualisieren [Erforderlich] Attribut mit diesen beiden Parametern.

ErrorMessageResourceType - Typ, die (in unserem Beispiel ResourcesProject.Resources) genannt wird

ErrorMessageResourceName - Eigenschaft, die von der Art oben genannt wird (in unserem Fall RequiredAttribute)

Hier ist ein sehr vereinfachtes Login-Modell, das nur Benutzername Validierungsnachricht zeigt. Wenn das Feld leer ist, wird es von dem String nehmen ResourcesProject.Resources.RequiredAttribute und dies als Fehler angezeigt werden.

    public class LoginModel
    {        
        [Required(ErrorMessageResourceType = typeof(Resources.Resources), ErrorMessageResourceName="RequiredAttribute")]
        [Display(Name = "User name")]
        public string UserName { get; set; }
}

Sie können Ihr eigenes Attribut schreiben

public class MyRequiredAttribute : ValidationAttribute
{
    MyRequiredAttribute() : base(() => "{0} blah blah blah blaaaaaah")
    {

    }

    public override bool IsValid(object value)
    {
        if (value == null)
        {
            return false;
        }
        string str = value as string;
        if (str != null)
        {
            return (str.Trim().Length != 0);
        }
        return true;
    }
}

Dies ist Kopie RequiredAttribute von Reflector mit geändertener Fehlermeldung.

using Resources;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Reflection;
using System.Resources;
using System.Web;
using System.Web.Mvc;

public class CustomRequiredAttribute : RequiredAttribute,  IClientValidatable
{
    public CustomRequiredAttribute()
    {
        ErrorMessageResourceType = typeof(ValidationResource);
        ErrorMessageResourceName = "RequiredErrorMessage";
    }


    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {


        yield return new ModelClientValidationRule
        {
            ErrorMessage = GetRequiredMessage(metadata.DisplayName),
            ValidationType = "required"
        };
    }


    private string GetRequiredMessage(string displayName) {

        return displayName + " " + Resources.ValidationResource.RequiredErrorMessageClient;        

    }


}

App_GlobalResources / ValidationResource.resx

Jetzt Datenaufbelichtung verwenden

[CustomRequired]

Das funktionierte für mich. Lesen Sie sorgfältig die Kommentare in den Code. (Basierend auf Chads Antwort).

 // Keep the name the same as the original, it helps trigger the original javascript 
 // function for client side validation.

        public class RequiredAttribute : System.ComponentModel.DataAnnotations.RequiredAttribute, IClientValidatable
            {
                public RequiredAttribute()
                {
                    this.ErrorMessage = "Message" // doesnt get called again. only once.
                }

                public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
                {
                    yield return new ModelClientValidationRule
                    {
                        ErrorMessage = "Message", // this gets called on every request, so it's contents can be dynamic.
                        ValidationType = "required"
                    };
                }
            }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top