2011-03-03 8 views
8

Este es el error que estoy usando MVC2:ErrorMessageResourceName y ErrorMessage no se pueden establecer, pero sólo estoy estableciendo una

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

Viene de la [Obligatorio] Validación DataAnnotation.

traza

Pila:

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 

He hervido mi vista del modelo reduce a esto (que se rompe cada vez que hay un [Obligatorio] atributo, funciona bien sin):

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

Mi el controlador devuelve un modelo de vista vacío, y el formulario en la vista está completamente en blanco ... solo un botón de envío.

+0

verifique mi respuesta [Aquí] (http://stackoverflow.com/a/36878989/6061777) al enfrentar este error en las validaciones personalizadas. –

Respuesta

19

El problema radica en configurar el ErrorMessage en una cadena en blanco. Tendría que suponer que en algún momento hay un cheque para String.Empty en el código MVC que está causando problemas.

Al configurar ErrorMessage en "" (un espacio) se solucionó el problema.

+1

También se puede establecer como nulo. – mikalai

0

Mi conjetura es [DataType(DataType.Text)] tiene un mensaje de validación definido en los recursos (en System.ComponentModel.DataAnnotations.Resources) y la existencia de eso y su [Required] está causando este InvalidOperationException. Intente eliminar [DataType] o [Required] y vea si la excepción desaparece.

+0

Mismo resultado. Voy a revertir el archivo a la mañana de ayer y ver qué pasa. –

20

En mi caso, he escritura ErrorMessage = null, ejemplo:

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

ErrorMessage = " " no funcionan.

+1

Esto funcionó para mí, esto debería marcarse como respuesta. – Taher

0

Tuve un problema similar con una ValidationAttribute personalizada.

En el método IsValid estaba configurando ErrorMessage. La solución fue eliminar la asignación a la Propety 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; 
} 

me writting Unidad de prueba y que estaban pasisng sólo si yo estaba corriendo/depuración de uno en uno. Pero cuando hago clic en "Ejecutar todo", ¿solo está pasando el primero? No están vinculados de ninguna manera ...

También probé https://stackoverflow.com/a/20848920/4798459 No funcionó tampoco.

Así que sí, la solución fue eliminar la asignación a la propety ErrorMessage!

Cuestiones relacionadas