2010-03-19 1 views
19

Ich verwende die DataAnnotations Attribute zusammen mit ASP.Net MVC 2 Modellvalidierung für meine Viewmodel zu bieten:Bereitstellen von lokalisierten Fehlermeldungen für nicht attributierte Modellvalidierung in ASP.Net MVC 2?

public class ExamplePersonViewModel { 
    [Required(ErrorMessageResourceName = "Required", ErrorMessageResourceType = typeof(Resources.Validation))] 
    [StringLength(128, ErrorMessageResourceName = "StringLength", ErrorMessageResourceType = typeof(Resources.Validation))] 
    [DataType(DataType.Text)] 
    public string Name { get; set; } 

    [Required(ErrorMessageResourceName = "Required", ErrorMessageResourceType = typeof(Resources.Validation))] 
    [DataType(DataType.Text)] 
    public int Age { get; set; } 
} 

Dies scheint wie erwartet zu funktionieren (obwohl es sehr ausführlich ist). Das Problem, das ich habe, ist, dass hinter den Kulissen Modellvalidierungen durchgeführt werden, die nicht an ein bestimmtes Attribut gebunden sind. Ein Beispiel dafür im obigen Modell ist, dass die Eigenschaft Age eine int sein muss. Wenn Sie versuchen, einen nicht ganzzahligen Wert im Formular einzugeben, wird ein Fehler mit der folgenden (nicht lokalisierten) Nachricht angezeigt:

Das Feld Alter muss eine Zahl sein.

Wie können diese Validierungsnachrichten ohne Attribut lokalisiert werden?

Gibt es eine vollständige Liste dieser Nachrichten zur Verfügung, so dass ich sicherstellen kann, dass sie alle lokalisiert sind?

Antwort

18

Gehen Sie zu http://forums.asp.net/p/1512140/3608427.aspx, sehen Sie sich die Nachricht von bradwils vom 01-09-2010, 18:20 Uhr an.

Die Lösung funktioniert gut für mich.

Es sollte die vollständige Liste der Nachrichten zu wissen overridable ...

UPDATE

Hier werden die Post Inhalte interessant sein:

Erstellen Sie eine globale Ressourcenklasse in App_GlobalResources, Setzen Sie DefaultModelBinder.ResourceClassKey auf den Namen dieser Klasse (wenn Sie beispielsweise "Messages.resx" erstellt haben, legen Sie ResourceClassKey auf "Messages" fest).

Es gibt zwei Strings, die Sie in MVC 2 außer Kraft setzen können:

  • Der String-Wert für „PropertyValueInvalid“ wird verwendet, wenn die Daten der Benutzer nicht kompatibel mit dem Datentyp eingegeben ist (zum Beispiel eingeben "abc" für ein ganzzahliges Feld). Die Standardmeldung hierfür lautet: "Der Wert '{0}' ist für {1} nicht gültig."
  • Der Zeichenfolgenwert für "PropertyValueRequired" wird verwendet, wenn der Benutzer keine Daten für ein Feld eingegeben hat, für das keine Nullwerte zulässig sind (z. B. ein Ganzzahlfeld). Die Standardmeldung hierfür lautet: "Ein Wert ist erforderlich."

Es ist wichtig, im zweiten Fall zu beachten, dass, wenn Sie die DataAnnotationsModelValidatorProvider in Ihrer Validator Anbieter Liste haben (die es standardmäßig ist), dann werden Sie nie diese zweite Meldung sehen. Dieser Anbieter sieht nicht optionale Felder und fügt ihnen ein impliziertes [Erforderlich] -Attribut hinzu, so dass ihre Nachrichten mit anderen Feldern mit expliziten [Erforderlich] -Attributen konsistent sind und dass Sie eine clientseitige Validierung für erforderliche Felder erhalten.

+1

Weitere Informationen, die ich auch gefunden habe: http://StackOverflow.com/Questions/1538873/How-to-Replace-the-default-modelstate-error-message-in-asp-net-mvc-2/ –

+7

It Es ist wichtig zu beachten, dass Sie dadurch nur bei der Validierung auf der SERVER-SIDE eine lokalisierte Fehlermeldung erhalten. Um Ihre lokalisierte Nachricht auch auf der Client-Seite zu haben, müssen Sie 'ClientDataTypeModelValidatorProvider' aus der MVC-Quelle kopieren und einfügen und die' MakeErrorString'-Methode neu schreiben. Weitere Informationen [hier] (http://jwwishart.blogspot.com/2011/03/custom-server-and-client-side-required.html), blättern Sie zum Ende. Ich nahm mir verdammt viel Zeit, um herauszufinden, dass sowohl die Client- als auch die Serverseite unterschiedliche Mittel verwenden, um diese Nachricht zu erhalten. Hoffe das hilft jemandem Zeit zu sparen. –

+0

Sie sagen, dass die zweite Nachricht nie angezeigt wird, wenn Sie DataAnnotationsModelValidatorProvider in der Liste der Validatoranbieter haben. Wie kann ich dieses Problem überwinden? – Andrew

7

Liste der Nachrichten (MVC 3.0):

ActionMethodSelector_AmbiguousMatch 
ActionMethodSelector_AmbiguousMatchType 
AsyncActionMethodSelector_AmbiguousMethodMatch 
AsyncActionMethodSelector_CouldNotFindMethod 
AsyncCommon_AsyncResultAlreadyConsumed 
AsyncCommon_ControllerMustImplementIAsyncManagerContainer 
AsyncCommon_InvalidAsyncResult 
AsyncCommon_InvalidTimeout 
AuthorizeAttribute_CannotUseWithinChildActionCache 
ChildActionOnlyAttribute_MustBeInChildRequest 
ClientDataTypeModelValidatorProvider_FieldMustBeNumeric 
Common_NoRouteMatched 
Common_NullOrEmpty 
Common_PartialViewNotFound 
Common_PropertyCannotBeNullOrEmpty 
Common_PropertyNotFound 
Common_TriState_False 
Common_TriState_NotSet 
Common_TriState_True 
Common_TypeMustDriveFromType 
Common_ValueNotValidForProperty 
Common_ViewNotFound 
CompareAttribute_MustMatch 
CompareAttribute_UnknownProperty 
Controller_UnknownAction 
Controller_UpdateModel_UpdateUnsuccessful 
Controller_Validate_ValidationFailed 
ControllerBase_CannotExecuteWithNullHttpContext 
ControllerBase_CannotHandleMultipleRequests 
ControllerBuilder_ErrorCreatingControllerFactory 
ControllerBuilder_FactoryReturnedNull 
ControllerBuilder_MissingIControllerFactory 
CshtmlView_ViewCouldNotBeCreated 
CshtmlView_WrongViewBase 
DataAnnotationsModelMetadataProvider_UnknownProperty 
DataAnnotationsModelMetadataProvider_UnreadableProperty 
DataAnnotationsModelValidatorProvider_ConstructorRequirements 
DataAnnotationsModelValidatorProvider_ValidatableConstructorRequirements 
DefaultControllerFactory_ControllerNameAmbiguous_WithoutRouteUrl 
DefaultControllerFactory_ControllerNameAmbiguous_WithRouteUrl 
DefaultControllerFactory_ErrorCreatingController 
DefaultControllerFactory_NoControllerFound 
DefaultControllerFactory_TypeDoesNotSubclassControllerBase 
DefaultModelBinder_ValueInvalid 
DefaultModelBinder_ValueRequired 
DefaultViewLocationCache_NegativeTimeSpan 
DependencyResolver_DoesNotImplementICommonServiceLocator 
ExceptionViewAttribute_NonExceptionType 
ExpressionHelper_InvalidIndexerExpression 
FilterAttribute_OrderOutOfRange 
HtmlHelper_InvalidHttpMethod 
HtmlHelper_InvalidHttpVerb 
HtmlHelper_MissingSelectData 
HtmlHelper_TextAreaParameterOutOfRange 
HtmlHelper_ValidationParameterCannotBeEmpty 
HtmlHelper_ValidationParameterMustBeLegal 
HtmlHelper_ValidationTypeCannotBeEmpty 
HtmlHelper_ValidationTypeMustBeLegal 
HtmlHelper_ValidationTypeMustBeUnique 
HtmlHelper_WrongSelectDataType 
JsonRequest_NotAllowed 
ModelBinderAttribute_ErrorCreatingModelBinder 
ModelBinderAttribute_TypeNotIModelBinder 
ModelBinderDictionary_MultipleAttributes 
ModelMetadata_PropertyNotSettable 
MvcRazorCodeParser_CannotHaveModelAndInheritsKeyword 
MvcRazorCodeParser_ModelKeywordMustBeFollowedByTypeName 
MvcRazorCodeParser_OnlyOneModelStatementIsAllowed 
OutputCacheAttribute_CannotNestChildCache 
OutputCacheAttribute_ChildAction_UnsupportedSetting 
OutputCacheAttribute_InvalidDuration 
OutputCacheAttribute_InvalidVaryByParam 
PrivateAssociatedMetadataTypeTypeDescriptor_MetadataTypeContainsUnknownProperties 
RedirectAction_CannotRedirectInChildAction 
ReflectedActionDescriptor_CannotCallInstanceMethodOnNonControllerType 
ReflectedActionDescriptor_CannotCallMethodsWithOutOrRefParameters 
ReflectedActionDescriptor_CannotCallOpenGenericMethods 
ReflectedActionDescriptor_CannotCallStaticMethod 
ReflectedActionDescriptor_ParameterCannotBeNull 
ReflectedActionDescriptor_ParameterNotInDictionary 
ReflectedActionDescriptor_ParameterValueHasWrongType 
ReflectedAsyncActionDescriptor_CannotExecuteSynchronously 
ReflectedParameterBindingInfo_MultipleConverterAttributes 
RemoteAttribute_NoUrlFound 
RemoteAttribute_RemoteValidationFailed 
RequireHttpsAttribute_MustUseSsl 
SessionStateTempDataProvider_SessionStateDisabled 
SingleServiceResolver_CannotRegisterTwoInstances 
SynchronizationContextUtil_ExceptionThrown 
TemplateHelpers_NoTemplate 
TemplateHelpers_TemplateLimitations 
Templates_TypeMustImplementIEnumerable 
TypeCache_DoNotModify 
ValidatableObjectAdapter_IncompatibleType 
ValueProviderResult_ConversionThrew 
ValueProviderResult_NoConverterExists 
ViewDataDictionary_ModelCannotBeNull 
ViewDataDictionary_WrongTModelType 
ViewMasterPage_RequiresViewPage 
ViewPageHttpHandlerWrapper_ExceptionOccurred 
ViewStartPage_RequiresMvcRazorView 
ViewUserControl_RequiresViewDataProvider 
ViewUserControl_RequiresViewPage 
WebFormViewEngine_UserControlCannotHaveMaster 
WebFormViewEngine_ViewCouldNotBeCreated 
WebFormViewEngine_WrongViewBase 
+0

Danke! Woher hast du diese Liste? – Andrew

+0

Es war lange her, aber wie ich mich erinnere, war es entweder etwas, das ich mit Reflexion druckte, oder eher ausgegraben mit [ILSpy] (http://ilspy.net/) –

+0

Für MVC 5 System.Web.MVC hat Einen Ressourcenordner, der die Ressourcendatei für System.Web.Mvc.Properties.MvcResources.resources mit allen Ressourcennamen und Nachrichten angibt – Dacker

0

einfache Weise Meldung wie Integer für Lokalisierung Fehlermeldung angeben, Double, Float Sie es wie folgt tun können.

[Required(ErrorMessageResourceName = "Required", ErrorMessageResourceType = typeof(Resources.Validation))] 
[Range(0, int.MaxValue, ErrorMessageResourceName = "ValidateAge", ErrorMessageResourceType = typeof(Resources.Validation))] 
[DataType(DataType.Text)] 
public string Age { get; set; } 

So anstelle von Integer, Doppel- und Verwendung String mit Bereich Attribute Float und Ihre benutzerdefinierte Lokalisierung Fehlermeldung mit ihm angeben.