代码之家  ›  专栏  ›  技术社区  ›  Lance McNearney

为ASP.NETMVC2中的非属性化模型验证提供本地化错误消息?

  •  19
  • Lance McNearney  · 技术社区  · 15 年前

    DataAnnotations 属性以及ASP.Net MVC 2来为my 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 . 如果尝试在窗体上输入非整数值,将出现以下错误(非本地化)消息:

    字段年龄必须是数字。

    如何本地化这些非属性验证消息?

    3 回复  |  直到 15 年前
        1
  •  19
  •   Diego Maninetti    15 年前

    http://forums.asp.net/p/1512140/3608427.aspx ,观看bradwils于2010年9月1日下午6:20发布的消息。

    了解可覆盖消息的完整列表应该很有趣。。。

    更新

    帖子内容如下:

    在App\u GlobalResources中创建一个全局资源类,并将DefaultModelBinder.ResourceClassKey设置为此类的名称(例如,如果您设置了“Messages.resx”,则将ResourceClassKey设置为“Messages”)。

    在MVC 2中有两个字符串可以重写:

    • “PropertyValueRequired”的字符串值在用户没有为不可为空的字段(例如,整数字段)输入任何数据时使用。默认消息是:“需要一个值。”

    在第二种情况下需要注意的是,如果您的验证器提供者列表中有DataAnnotationsModelValidatorProvider(默认情况下是这样),那么您将永远不会看到第二条消息。此提供程序将看到非可选字段,并向其添加隐含的[Required]属性,以便其消息与具有显式[Required]属性的其他字段保持一致,并确保您获得客户端对必填字段的验证。

        2
  •  7
  •   Goran Obradovic    13 年前

    消息列表(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
    
        3
  •  0
  •   Dilip Langhanoja    10 年前

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

    因此,double和Float不使用Integer,而是使用带有Range属性的字符串,并用它指定自定义的本地化错误消息。