Exceção de conversão inválida, mesmo quando tenho um operador de conversão implícito definido (no aplicativo asp mvc)

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

Pergunta

Tenho uma classe de modelo mvc criada e uma das propriedades é do tipo 'MyObject'.Ele também possui um atributo System.ComponentModel.DataAnnotations.StringLength.

MyObject como operadores de conversão implícitos para que possa ser usado essencialmente como uma string:

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

Este é um problema do asp mvc por algum motivo estranho?Pergunto porque sei que na maioria dos casos a conversão implícita funciona bem, posso, por exemplo, atribuir essa propriedade a um valor de string e funciona perfeitamente.

Editar - Ok, eu sei porque o erro está ocorrendo:
É porque o método StringLength.IsValid() usa um objeto como parâmetro, então a conversão está indo de objeto para string, não de MyObject para string, então isso explica por que meu operador de conversão implícito não está sendo chamado.Mas como contornar isso?

Tudo funcionou bem até que coloquei o atributo System.ComponentModel.DataAnnotations.StringLength na propriedade do meu modelo, então, quando a visualização faz uma postagem a partir de um botão de envio, recebi a exceção:

[InvalidCastException:Não é possível fundir o objeto do tipo 'strataSpot.shared.models.mail' to type 'System.string'.
System.componentModel.dataannotações.stringLengthattribute.isvalid (valor do objeto) +34
System.Web.MVC.D__1.MoveNext () +56 System.Web.MVC.DefaultModelbinder.onPropertyValidated (ControlContext ControlContext, ModelBindingContext BindingContext, PropertyDesTorTercripctor, Object) +203 System.WeBeBeBeBeBext.WeBeBext.WeBringM.CoSTROTEFROTCIPTROTCRIPTROTCTR, objeto) +203 System.weBeBeBeBext.webringM. Ontext, ModelBindingContext BindingContext, PropertyDescriptor PropertyDescriptor) +413
System.Web.MVC.DefaultModelbinder.BindProperties (ControlContext ControlContext, ModelBindingContext BindingContext) +90
System.web.mvc.defaultModelbinder.bindComplexElementalmodel (controlContext ControlContext, ModelBindingContext BindingContext, modelo de objeto) +383
System.Web.MVC.DefaultModelbinder.BindComplexModel (ControlContext ControlContext, ModelBindingContext BindingContext) +1048
System.Web.MVC.DefaultModelbinder.BindModel (ControlContext ControlContext, ModelBindingContext BindingContext) +280
System.Web.MVC.ControllerActionInvoker.getParameterValue (ControlContext ControlContext, ParameterDescriptor ParameterDescriptor) +257
System.Web.MVC.ControllerActionInvoker.getParameTerValues ​​(ControlContext ControlContext, ActionDescriptor ActionDescriptor) +109
System.Web.MVC.ControllerActionInvoker.inVokeAction (ControlContext ControlContext, String ActionName) +314 System.Web.MVC.Controller.Exectecore () +105 System.web.mvc.ControllerBase.execore (SolicpryTerCoTCONTCONTCONTCEXTCOXTCOXTCOXTCOTCOTCOTCOTCOTCOTCOTECTENTENTENTENTENTENTENTCOTCUTECIONCETCOTCOTECTENTECTEXTECTENTCOTCUTE (SolternTen3)
System.web.mvc.controllerbase.system.web.mvc.icontroller.execute (requestContext requestcontext) +7
System.web.mvc.1.<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 (resultado da IIAsyncresult) +7
System.Web.CallHandleRexecutionStep.system.web.httpapplication.iexecutionstep.execute () +8678910 System.web.httpapplication.exectestep (Steputionstep, boolean & boolean & completa completa) +15

Foi útil?

Solução

Você não pode usar [StringLength] para uma propriedade de um tipo diferente de String.Se quiser duplicar a funcionalidade, você pode criar uma subclasse de StringLengthAttribute:

public class MyCoolAttribute : StringLengthAttribute {
  // constructor here

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

Em seguida, coloque [MyCool] em vez de [StringLength] em sua propriedade.Usar um operador de conversão nesse sentido provavelmente não é a coisa mais limpa do mundo;você provavelmente deveria usar ToString() ou algo semelhante.Mas a ideia é a mesma.

Alternativamente, se você não quiser criar uma subclasse de StringLengthAttribute, você pode simplesmente delegar para o método IsValid() de uma instância privada de StringLengthAttribute.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top