2010-03-19 20 views
19

estoy usando los atributos DataAnnotations junto con ASP.Net MVC 2 para proporcionar la validación de modelos para mis ViewModels:¿Proporciona mensajes de error localizados para la validación de modelos no atribuidos en 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; } 
} 

Esto parece funcionar como se esperaba (aunque es muy detallado). El problema que tengo es que hay validación de modelos detrás de escena que no están vinculados a ningún atributo específico. Un ejemplo de esto en el modelo anterior es que la propiedad Age debe ser 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 verificar que estén todos localizados?

Respuesta

18

Vaya a http://forums.asp.net/p/1512140/3608427.aspx, mire el mensaje de bradwils del 01-09-2010, 6:20 PM.

La solución funciona bien para mí.

Debe ser interesante conocer la lista completa de los mensajes reemplazables ...

ACTUALIZACIÓN

Aquí el contenido de correos:

Crear una clase de recurso global en App_GlobalResources, y establezca DefaultModelBinder.ResourceClassKey en el nombre de esta clase (por ejemplo, si creó "Messages.resx", entonces establezca ResourceClassKey en "Messages").

Hay dos cadenas se puede anular en MVC 2:

  • El valor de cadena para "PropertyValueInvalid" se utiliza cuando los datos que el usuario introducido no es compatible con el tipo de datos (por ejemplo, escribiendo "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 utiliza cuando el usuario no ingresó ningún dato para un campo que no es nulo (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 usted tiene la DataAnnotationsModelValidatorProvider en su lista de proveedores de validación (que está por defecto), entonces nunca ver este segundo mensaje. Este proveedor ve campos no opcionales y agrega un atributo implícito [Requerido] para que sus mensajes sean consistentes con otros campos con atributos explícitos [Requerido] y para asegurar que usted obtenga la validación del lado del cliente para los campos requeridos.

+1

información adicional I encontró así: http://stackoverflow.com/questions/1538873/how-to-replace-the-default-modelstate-error-message-in-asp-net-mvc-2/ –

+7

Se Es importante tener en cuenta que al hacer esto, solo tendrá un mensaje de error localizado al validar en el lado del servidor. Para tener su mensaje localizado en el lado del cliente también tendrá que copiar y pegar 'ClientDataTypeModelValidatorProvider' desde MVC source y reescribir su método' MakeErrorString'. Más información [aquí] (http://jwwishart.blogspot.com/2011/03/custom-server-and-client-side-required.html), desplácese a la enda. Me tomó muchísimo tiempo descubrir que tanto el lado del cliente como el lado del servidor usan medios diferentes para transmitir ese mensaje. Espero que esto ayude a alguien a ahorrar tiempo. –

+0

Usted dice que el segundo mensaje nunca se mostrará si tiene DataAnnotationsModelValidatorProvider en la lista de proveedores del validador. ¿Cómo puedo superar este problema? – Andrew

7

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 
+0

Gracias! ¿De dónde sacaste esta lista? – Andrew

+0

Fue hace mucho tiempo, pero recuerdo que fue algo que imprimí con reflexión, o más probablemente lo extraje con [ILSpy] (http://ilspy.net/) –

+0

Para MVC 5 System.Web.MVC tiene una carpeta de Recursos que especifica el archivo de recursos para System.Web.Mvc.Properties.MvcResources.resources con todos los nombres de recursos y mensajes – Dacker

0

Forma simple de especificar el mensaje de localización Mensaje de error 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; } 

Así que en lugar de utilizar Integer, Float doble y cadena uso con Rango atributo y especificar su localización personalizada mensaje de error con ella.

Cuestiones relacionadas