validar - ¿Proporcionar mensajes de error localizados para la validación de modelos sin atribución en ASP.Net MVC 2?
search mvc (3)
Estoy usando los atributos de DataAnnotations junto con ASP.Net MVC 2 para proporcionar la validación del modelo para mis ViewModels:
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; }
}
Esto parece funcionar como se esperaba (aunque es muy detallado). El problema que tengo es que se están realizando validaciones de modelos detrás de escena que no están vinculadas a ningún atributo específico. Un ejemplo de esto en el modelo anterior es que la propiedad Age
debe ser un int
. Si intenta ingresar un valor no entero en el formulario, se producirá un error con el siguiente mensaje (no localizado):
El campo Edad debe ser un número.
¿Cómo se pueden localizar estos mensajes de validación sin atributos?
¿Hay una lista completa de estos mensajes disponibles para que pueda asegurarme de que estén localizados?
Lista de mensajes (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
Una forma sencilla de especificar un mensaje de mensaje de error de localización como Entero, Doble, Flotante puede hacerlo de la siguiente manera.
[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; }
Entonces, en lugar de usar la cadena de uso Integer, double y Float con el atributo Range, especifique su mensaje de error de localización personalizado.
Vaya a http://forums.asp.net/p/1512140/3608427.aspx , vea el mensaje de Bradwils con fecha 01-09-2010, 6:20 PM.
La solución funciona bien para mí.
Debería ser interesante conocer la lista completa de los mensajes reemplazables ...
ACTUALIZAR
Aquí los contenidos del post:
Cree una clase de recurso global en App_GlobalResources y configure DefaultModelBinder.ResourceClassKey con el nombre de esta clase (por ejemplo, si creó "Messages.resx", luego configure ResourceClassKey como "Messages").
Hay dos cadenas que puedes anular en MVC 2:
- El valor de cadena para "PropertyValueInvalid" se usa cuando los datos que el usuario ingresó no son compatibles con el tipo de datos (por ejemplo, escribir "abc" para un campo entero). El mensaje predeterminado para esto es: "El valor ''{0}'' no es válido para {1}".
- El valor de cadena para "PropertyValueRequired" se usa cuando el usuario no ingresó ningún dato para un campo que no es anulable (por ejemplo, un campo entero). El mensaje predeterminado para esto es: "Se requiere un valor".
Es importante tener en cuenta en el segundo caso que, si tiene el DataAnnotationsModelValidatorProvider en su lista de proveedores de validador (que es de forma predeterminada), nunca verá este segundo mensaje. Este proveedor ve campos no opcionales y les agrega un atributo [Requerido] implícito para que sus mensajes sean consistentes con otros campos con atributos [Requeridos] explícitos y para garantizar que obtenga la validación del lado del cliente para los campos requeridos.