2010-03-19 12 views
19

Sto utilizzando gli attributi DataAnnotations con ASP.Net MVC 2 per fornire la convalida del modello per i miei ViewModels:Fornire messaggi di errore localizzati per la convalida del modello non attribuita 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; } 
} 

Questo sembra funzionare come previsto (anche se è molto verboso). Il problema che ho è che ci sono convalide del modello dietro le quinte in corso che non sono legate ad alcun attributo specifico. Un esempio di questo nel modello precedente è che la proprietà Age deve essere un int. Se si tenta di immettere un valore non intero sul modulo, verrà visualizzato un errore con il seguente messaggio (non localizzato):

Il campo Età deve essere un numero.

Come possono questi messaggi di convalida non attributo essere localizzati?

Esiste un elenco completo di questi messaggi disponibili in modo che possa essere sicuro che siano tutti localizzati?

risposta

18

Vai a http://forums.asp.net/p/1512140/3608427.aspx, guarda il messaggio di bradwils datato 01-09-2010, 6:20 PM.

La soluzione funziona bene per me.

Dovrebbe essere interessante per conoscere l'elenco completo dei messaggi Overridable ...

UPDATE

Ecco il contenuto pubblicare:

Creare una classe risorsa globale in App_GlobalResources, e imposta DefaultModelBinder.ResourceClassKey sul nome di questa classe (ad esempio, se hai fatto "Messages.resx", quindi imposta ResourceClassKey su "Messaggi").

ci sono due stringhe è possibile ignorare in MVC 2:

  • Il valore di stringa per "PropertyValueInvalid" viene utilizzato quando i dati che l'utente inserito non è compatibile con il tipo di dati (ad esempio, digitando "abc" per un campo intero). Il messaggio predefinito per questo è: "Il valore '{0}' non è valido per {1}."
  • Il valore di stringa per "PropertyValueRequired" viene utilizzato quando l'utente non ha inserito alcun dato per un campo che non è annullabile (ad esempio, un campo intero). Il messaggio predefinito per questo è: "È richiesto un valore."

E 'importante notare nel secondo caso che, se avete la DataAnnotationsModelValidatorProvider nella vostra lista provider di convalida (che lo è di default), allora non sarà mai vedere questo secondo messaggio. Questo provider visualizza campi non facoltativi e aggiunge loro un attributo implicito [Required] in modo che i loro messaggi siano coerenti con altri campi con attributi [Richiesti] espliciti e per garantire che si ottenga la convalida sul lato client per i campi obbligatori.

+1

Ulteriori informazioni Ho trovato anche: http://stackoverflow.com/questions/1538873/how-to-replace-the-default-modelstate-error-message-in-asp-net-mvc-2/ –

+7

It è importante notare che, facendo ciò, si avrà solo un messaggio di errore localizzato durante la convalida su SERVER-SIDE. Per avere il tuo messaggio localizzato sul lato client dovrai anche copiare e incollare 'ClientDataTypeModelValidatorProvider' dal sorgente MVC e riscrivere il suo metodo' MakeErrorString'. Maggiori informazioni [qui] (http://jwwishart.blogspot.com/2011/03/custom-server-and-client-side-required.html), scorrere fino a enda. Mi ci è voluto un sacco di tempo per capire che lato client e lato server usano entrambi mezzi diversi per ottenere quel messaggio. Spero che questo aiuti qualcuno a risparmiare tempo. –

+0

Si dice che il secondo messaggio non verrà mai visualizzato se si dispone di DataAnnotationsModelValidatorProvider nell'elenco dei provider di convalida. Come posso superare questo problema? – Andrew

7

Elenco dei messaggi (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

Grazie! Dove hai preso questa lista? – Andrew

+0

Era molto tempo fa, ma come ricordo è stato qualcosa che ho stampato con reflexion, o più probabilmente scavato con [ILSpy] (http://ilspy.net/) –

+0

Per MVC 5 System.Web.MVC ha una cartella Risorse che specifica il file-risorse per System.Web.Mvc.Properties.MvcResources.resources con tutti i nomi e i messaggi di risorse – Dacker

0

Un modo semplice per specificare il messaggio per il messaggio di errore di localizzazione come Intero, Doppio, Float è possibile farlo seguendo la strada.

[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; } 

Così, invece di usare Integer, doppia e Float uso stringa con attributo Range e specificare il messaggio di localizzazione di errore personalizzato con esso.

Problemi correlati