Введенное исключение приведения, даже если у меня определен неявный оператор приведения (в приложении asp mvc)

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

Вопрос

У меня есть созданный класс модели mvc, и одно из свойств имеет тип 'MyObject'.У него также есть System.ComponentModel.DataAnnotations.Атрибут StringLength для него.

MyObject как неявные операторы приведения, поэтому его, по сути, можно использовать как строку:

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

Является ли это проблемой asp mvc по какой-то странной причине?Я спрашиваю, потому что я знаю, что в большинстве случаев неявное приведение работает нормально, я могу, например, присвоить этому свойству строковое значение, и оно работает просто отлично.

Редактировать - Хорошо, я знаю, почему возникает ошибка:
Это потому, что длина строки.Метод isValid() принимает объект в качестве параметра, поэтому приведение фактически происходит от объекта к строке, а не от MyObject к string, так что это объясняет, почему мой неявный оператор приведения не вызывается.Но как обойти это?

Все это работало нормально, пока я не установил System.ComponentModel.DataAnnotations.Атрибут StringLength для свойства в моей модели, затем, когда представление выполняет публикацию с помощью кнопки отправки, я получаю исключение:

[Исключение InvalidCastException:Невозможно выполнить приведение объект типа 'StrataSpot.Общий.Модели.Электронное письмо" кому введите "System.String".]
System.ComponentModel.Примечания к данным.StringLengthAttribute.isValid(объект значение) +34
System.Web.Mvc.d__1.MoveNext() +56 System.Web.Mvc.DefaultModelBinder.OnPropertyValidated(ControllerContext ControllerContext, ModelBindingContext BindingContext, PropertyDescriptor PropertyDescriptor, значение объекта) +203 System.Web.Mvc.DefaultModelBinder.BindProperty(ControllerContext ControllerContext, ModelBindingContext BindingContext, PropertyDescriptor PropertyDescriptor) +413
System.Web.Mvc.DefaultModelBinder.Свойства привязки (ControllerContext ControllerContext, ModelBindingContext BindingContext) +90
System.Web.Mvc.DefaultModelBinder.BindComplexElementalModel(ControllerContext ControllerContext, ModelBindingContext BindingContext, Объектная модель) +383
System.Web.Mvc.DefaultModelBinder.BindComplexModel(ControllerContext ControllerContext, ModelBindingContext BindingContext) +1048
System.Web.Mvc.DefaultModelBinder.bindModel(ControllerContext ControllerContext, ModelBindingContext BindingContext) +280
System.Web.Mvc.ControllerActionInvoker.Получить параметрическое значение (ControllerContext ControllerContext, ParameterDescriptor ParameterDescriptor) +257
System.Web.Mvc.ControllerActionInvoker.Получаем значения параметра (ControllerContext ControllerContext, ActionDescriptor actionDescriptor) +109
System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext ControllerContext, строковое имя действия) +314 System.Web.Mvc.Controller.ExecuteCore() +105 System.Web.Mvc.ControllerBase.Выполнить (RequestContext RequestContext) +39
System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Выполнить (RequestContext RequestContext) +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.Запрос конечного процесса (IAsyncResult результат) +7
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Выполнить() +8678910 System.Web.HttpApplication.Выполнить шаг (IExecutionStep шаг, логическое значение и выполняется синхронно) +155

Это было полезно?

Решение

Вы не можете использовать [StringLength] для свойства типа, отличного от String .Если вы хотите дублировать функциональность, вы можете создать подкласс StringLengthAttribute:

public class MyCoolAttribute : StringLengthAttribute {
  // constructor here

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

Затем добавьте [MyCool] вместо [StringLength] в ваше свойство.Использование оператора приведения в этом отношении, вероятно, не самая чистая вещь в мире;вероятно, вам следует вместо этого использовать toString() или что-то подобное.Но идея та же самая.

В качестве альтернативы, если вы не хотите создавать подкласс StringLengthAttribute, вы можете просто делегировать вместо этого метод isValid() частного экземпляра StringLengthAttribute.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top