2011-03-03 111 views
8

這是我使用MVC2得到的錯誤:它是由[必需]驗證DataAnnotation未來ErrorMessageResourceName和的ErrorMessage不能同時設置,但我只設置一個

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

堆棧跟蹤:

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(ErrorMessage = "")] 
[DataType(DataType.Text)] 
[DisplayName("Property Name")] 
public string MyProperty { get; set; } 

我控制器返回一個空的ViewModel,並且視圖中的表單是完全空白的......只是一個提交按鈕。

+0

檢查我的答案[這裏](http://stackoverflow.com/a/36878989/6061777)在自定義驗證上面臨此錯誤。 – 2016-04-27 02:08:29

回答

19

問題在於將ErrorMessage設置爲空字符串。我不得不假設在某些時候,MVC代碼中存在對String.Empty的檢查,這會導致問題。

將ErrorMessage設置爲「」(一個空格)解決了問題。

+1

也可以設置爲null。 – mikalai 2012-09-11 09:38:24

0

我的猜測是[DataType(DataType.Text)]在資源定義(在System.ComponentModel.DataAnnotations.Resources)驗證消息的,這個存在和你的[Required]是導致此InvalidOperationException。嘗試刪除[DataType][Required]並查看是否異常消失。

+0

同樣的結果。我將把這個文件恢復到昨天上午,看看會發生什麼。 – 2011-03-04 13:55:54

20

在我的情況,我有寫的ErrorMessage = NULL,例如:

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

ErrorMessage = " "不起作用。

+1

這適用於我,這應該被標記爲答案。 – Taher 2013-09-02 14:31:42

0

我有一個自定義ValidationAttribute類似的問題。

在IsValid方法中,我設置了ErrorMessage。此修復程序是去除分配到的ErrorMessage歡迎使用屬性...

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

我書面方式單元測試,他們被pasisng只有當我被一個運行/調試一個。但是當我點擊「全部運行」時,只有第一個傳球?他們沒有以任何方式鏈接...

我也試過https://stackoverflow.com/a/20848920/4798459 也沒有工作。

所以是的,修復是刪除錯誤消息propety的分配!