Excepción de conversión no válida, incluso cuando tengo definido un operador de conversión implícito (en la aplicación asp mvc)

StackOverflow https://stackoverflow.com/questions/1996983

Pregunta

Tengo una clase de modelo mvc creada y una de las propiedades es de tipo 'MyObject'.También tiene un atributo System.ComponentModel.DataAnnotations.StringLength.

MyObject como operadores de conversión implícitos, por lo que esencialmente puede usarse como una cadena:

public static implicit operator string(MyObject o){...}
public static implicit operator MyObject(string sValue){...}

¿Es este un problema de ASP MVC por alguna extraña razón?Lo pregunto porque sé que en la mayoría de los casos la conversión implícita funciona bien. Por ejemplo, puedo asignar esa propiedad a un valor de cadena y funciona bien.

Editar: Ok, sé por qué ocurre el error:
Es porque el método StringLength.IsValid() toma un objeto como parámetro, por lo que la conversión en realidad va de un objeto a una cadena, no de MyObject a una cadena, lo que explica por qué no se llama a mi operador de conversión implícito.¿Pero cómo solucionar esto?

Todo esto funcionó bien hasta que puse el atributo System.ComponentModel.DataAnnotations.StringLength en la propiedad de mi modelo, luego, cuando la vista realiza una publicación desde un botón de envío, obtuve la excepción:

[Excepción de transmisión no válida:No se puede lanzar objeto de tipo 'StrataSpot.shared.models.email' para escribir 'System.string'.
System.componentModel.DataAnnotations.StringLengthAttribute.ISVALID (Valor de objeto) +34
System.Web.Mvc.d__1.MoveNext() 56 System.Web.Mvc.DefaultModelBinder.OnPropertyValidated(ControllerContext controladorContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, Valor del objeto) 203 System.Web.Mvc.DefaultModelBinder.BindProperty(ControllerContext) controladorContext, ModelBindingContext bindingContext, PropertyDescriptor descriptor de la propiedad) 413
System.Web.Mvc.DefaultModelBinder.BindProperties(ControllerContext) controladorContext, ModelBindingContext encuadernaciónContexto) 90
System.Web.Mvc.DefaultModelBinder.BindComplexElementalModel(ControllerContext) controladorContext, ModelBindingContext vinculaciónContexto, modelo de objeto) 383
System.Web.Mvc.DefaultModelBinder.BindComplexModel(ControllerContext) controladorContext, ModelBindingContext encuadernaciónContexto) 1048
System.Web.Mvc.DefaultModelBinder.BindModel(ControllerContext) controladorContext, ModelBindingContext encuadernaciónContexto) 280
System.Web.Mvc.ControllerActionInvoker.GetParameterValue(ControllerContext) controladorContext, ParameterDescriptor parámetroDescriptor) 257
System.Web.Mvc.ControllerActionInvoker.GetParameterValues(ControllerContext) controladorContext, ActionDescriptor acciónDescriptor) 109
System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext) controladorContext, acción de cadenaName) 314 System.Web.Mvc.Controller.ExecuteCore() 105 System.Web.Mvc.ControllerBase.Execute(RequestContext) solicitudContexto) 39
System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext) peticiónContexto) 7
System.Web.Mvc.<>c__DisplayClass8.b__4() 34 System.Web.Mvc.Async.<>c__DisplayClass1.b__0() 21 System.Web.Mvc.Async.<>c__DisplayClass81.<BeginSynchronous>b__7(IAsyncResult _) +12 System.Web.Mvc.Async.WrappedAsyncResult1.End() 59 System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult) asyncResult) 44
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult) resultado) 7
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 8678910 System.Web.HttpApplication.ExecuteStep(IExecutionStep) paso, Boolean& completadoSynchronously) 155

¿Fue útil?

Solución

No puede utilizar [StringLength] para una propiedad de un tipo que no sea String.Si desea duplicar la funcionalidad, puede crear una subclase StringLengthAttribute:

public class MyCoolAttribute : StringLengthAttribute {
  // constructor here

  public override bool IsValid(object value) {
    return base.IsValid((string)(value as MyObject));
  }
}

Luego coloque [MyCool] en lugar de [StringLength] en su propiedad.Usar un operador de reparto en este sentido probablemente no sea lo más limpio del mundo;probablemente deberías usar ToString() o algo similar en su lugar.Pero la idea es la misma.

Alternativamente, si no desea crear una subclase de StringLengthAttribute, puede simplemente delegar en el método IsValid() de una instancia privada de StringLengthAttribute.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top