Предоставление локализованных сообщений об ошибках для неатрибутивной проверки модели в ASP.Net MVC 2? - PullRequest
19 голосов
/ 20 марта 2010

Я использую атрибуты DataAnnotations вместе с ASP.Net MVC 2, чтобы обеспечить проверку модели для моих 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; }
}

Это, кажется, работает как ожидалось (хотя это очень многословно). У меня проблема в том, что существуют закулисные проверки моделей, которые не привязаны к какому-либо конкретному атрибуту. Примером этого в приведенной выше модели является то, что свойство Age должно быть int. Если вы попытаетесь ввести в форму нецелое значение, произойдет ошибка со следующим (нелокализованным) сообщением:

Поле Age должно быть числом.

Как можно локализовать эти сообщения проверки неатрибутов?

Доступен ли полный список этих сообщений, чтобы я мог убедиться, что они все локализованы?

Ответы [ 3 ]

18 голосов
/ 31 марта 2010

Перейдите на http://forums.asp.net/p/1512140/3608427.aspx,, чтобы посмотреть сообщение от bradwils от 01-09-2010, 18:20.

Решение хорошо работает для меня.

Интересно знать полный список перезаписываемых сообщений ...

UPDATE

Здесь содержание сообщения:

Создайте глобальный класс ресурсов в App_GlobalResources и установите DefaultModelBinder.ResourceClassKey в качестве имени этого класса (например, если вы создали «Messages.resx», то установите ResourceClassKey в «Сообщения»).

В MVC 2 можно переопределить две строки:

  • Строковое значение для «PropertyValueInvalid» используется, когда введенные пользователем данные несовместимы с типом данных (например, ввод «abc» для целочисленного поля). Сообщение по умолчанию для этого: «Значение {0} недопустимо для {1}».
  • Строковое значение для «PropertyValueRequired» используется, когда пользователь не вводил никаких данных для поля, которое не может быть обнуляемым (например, целочисленное поле). Сообщение по умолчанию для этого: «Требуется значение.»

Важно отметить, что во втором случае, если у вас есть DataAnnotationsModelValidatorProvider в вашем списке провайдеров валидатора (который по умолчанию), то вы никогда не увидите это второе сообщение. Этот провайдер видит необязательные поля и добавляет к ним неявный атрибут [Обязательный], чтобы их сообщения были согласованы с другими полями с явными атрибутами [Обязательные] и чтобы вы получили проверку на стороне клиента для обязательных полей.

7 голосов
/ 13 июня 2011

Список сообщений (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 голосов
/ 24 июля 2014

Простой способ указать сообщение для сообщения об ошибке локализации, например, Integer, Double, Float, вы можете сделать это следующим образом.

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

Таким образом, вместо использования Integer, double и Float используйте строку с атрибутом Range и укажите свое собственное сообщение об ошибке локализации вместе с ним.

...