ErrorMessageResourceName和ErrorMessage不能同时设置,但我只设置一个

时间:2011-03-03 23:54:31

标签: asp.net asp.net-mvc asp.net-mvc-2

这是我使用MVC2的错误:

Either ErrorMessageString or ErrorMessageResourceName must be set, but not both.

它来自[Required] Validation DataAnnotation。

堆栈追踪:

InvalidOperationException: Either ErrorMessageString or ErrorMessageResourceName must be set, but not both.]
   System.ComponentModel.DataAnnotations.ValidationAttribute.SetupResourceAccessor() +89338
   System.ComponentModel.DataAnnotations.ValidationAttribute.FormatErrorMessage(String name) +38
   System.Web.Mvc.<Validate>d__1.MoveNext() +215
   System.Web.Mvc.<Validate>d__5.MoveNext() +735
   System.Web.Mvc.DefaultModelBinder.OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext) +424
   System.Web.Mvc.DefaultModelBinder.BindComplexModel(ControllerContext controllerContext, ModelBindingContext bindingContext) +732
   System.Web.Mvc.ControllerActionInvoker.GetParameterValue(ControllerContext controllerContext, ParameterDescriptor parameterDescriptor) +475
   System.Web.Mvc.ControllerActionInvoker.GetParameterValues(ControllerContext controllerContext, ActionDescriptor actionDescriptor) +152
   System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +709
   System.Web.Mvc.Controller.ExecuteCore() +162
   System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__4() +58
   System.Web.Mvc.Async.<>c__DisplayClass1.<MakeVoidDelegate>b__0() +20
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +453
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +371

我已将我的视图模型简化为此(它会在任何时候出现[Required]属性,在没有的情况下正常工作):

[Required(ErrorMessage = "")]
[DataType(DataType.Text)]
[DisplayName("Property Name")]
public string MyProperty { get; set; }

我的控制器返回一个空的ViewModel,视图中的表单完全空白......只是一个提交按钮。

4 个答案:

答案 0 :(得分:22)

就我而言,我写了ErrorMessage = null,例如:

[EmailAddress(ErrorMessageResourceName = "FORM_FIELD_VALIDATION_EMAIL", ErrorMessageResourceType = typeof(App_GlobalResources.Common.View_Common_Forms), ErrorMessage = null)]

ErrorMessage = " "不起作用。

答案 1 :(得分:19)

问题在于将ErrorMessage设置为空字符串。我不得不假设在某些时候检查MVC代码中的String.Empty会导致问题。

将ErrorMessage设置为“”(一个空格)解决了这个问题。

答案 2 :(得分:0)

我的猜测是[DataType(DataType.Text)]在资源中定义了验证消息(在System.ComponentModel.DataAnnotations.Resources中),并且该[Required]的存在导致了这个InvalidOperationException。尝试删除[DataType][Required],看看异常是否消失。

答案 3 :(得分:0)

我有一个自定义ValidationAttribute的问题。

在IsValid方法中,我设置了ErrorMessage。解决方法是删除对ErrorMessage propety的赋值...

protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
    //code before ...
    this.ErrorMessage = this.FormatErrorMessage(validationContext.DisplayName); //NOT GOOD...
    ValidationResult validationResult = new ValidationResult(this.ErrorMessage, //And using the ErrorMessage Here...
        new[] { validationContext.MemberName });
    return validationResult;
}

我正在编写单元测试,只有当我一个接一个地运行/调试时才会进行调试。但是当我点击“全部运行”时,只有第一个通过?他们没有以任何方式联系......

我也试过https://stackoverflow.com/a/20848920/4798459 也没用。

所以,是的,修复是删除对ErrorMessage propety的分配!