Invaid يلقي استثناء ، حتى عندما يكون لدي ضمني يلقي المشغل تعريف (في asp mvc التطبيق)

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

سؤال

لدي نموذج mvc الطبقة خلق واحدة من الخصائص هي من نوع 'MyObject'.كما أن لديها نظام.ComponentModel.DataAnnotations.StringLength السمة على ذلك.

MyObject كما الضمني يلقي مشغلي لذلك يمكن أن تكون أساسا تستخدم سلسلة:

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

هذا asp mvc المسألة لسبب غريب?أنا أسأل لأنني أعرف في معظم الحالات الضمني يلقي يعمل بشكل جيد, يمكنني على سبيل المثال تعيين هذه الخاصية إلى قيمة سلسلة ويعمل على ما يرام.

تحرير - حسنا ، أنا أعرف لماذا الخطأ التي تحدث:
لأن StringLength.IsValid() الأسلوب يأخذ كائن كمعلمة ، حيث يلقي يجري في الواقع من كائن إلى سلسلة من MyObject إلى سلسلة ، هذا يفسر لماذا الضمني يلقي المشغل يتم استدعاء.ولكن كيف تعمل هذه ؟

هذا كل شيء يعمل على ما يرام حتى أنا وضعت النظام.ComponentModel.DataAnnotations.StringLength السمة على الممتلكات في النموذج ، ثم عندما ترى هل وظيفة من زر إرسال ، حصلت على استثناء:

[InvalidCastException:غير قادر على الزهر كائن من نوع 'StrataSpot.المشتركة.نماذج.البريد الإلكتروني إلى النوع 'System.سلسلة'.]
النظام.ComponentModel.DataAnnotations.StringLengthAttribute.IsValid(كائن قيمة) +34
النظام.ويب.Mvc.د__1.MoveNext() +56 النظام.ويب.Mvc.DefaultModelBinder.OnPropertyValidated(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor ، وجوه القيمة) +203 النظام.ويب.Mvc.DefaultModelBinder.BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor) +413
النظام.ويب.Mvc.DefaultModelBinder.BindProperties(ControllerContext controllerContext, ModelBindingContext bindingContext) +90
النظام.ويب.Mvc.DefaultModelBinder.BindComplexElementalModel(ControllerContext controllerContext, ModelBindingContext bindingContext, نموذج كائن) +383
النظام.ويب.Mvc.DefaultModelBinder.BindComplexModel(ControllerContext controllerContext, ModelBindingContext bindingContext) +1048
النظام.ويب.Mvc.DefaultModelBinder.BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) +280
النظام.ويب.Mvc.ControllerActionInvoker.GetParameterValue(ControllerContext controllerContext, ParameterDescriptor parameterDescriptor) +257
النظام.ويب.Mvc.ControllerActionInvoker.GetParameterValues(ControllerContext controllerContext, ActionDescriptor actionDescriptor) +109
النظام.ويب.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext ، سلسلة actionName) +314 النظام.ويب.Mvc.تحكم.ExecuteCore() +105 النظام.ويب.Mvc.ControllerBase.تنفيذ(RequestContext requestContext) +39
النظام.ويب.Mvc.ControllerBase.النظام.ويب.Mvc.IController.تنفيذ(RequestContext requestContext) +7
النظام.ويب.Mvc.<>ج__DisplayClass8.ب__4() +34 النظام.ويب.Mvc.المتزامن.<>ج__DisplayClass1.ب__0() +21 النظام.ويب.Mvc.المتزامن.<>ج__DisplayClass81.<BeginSynchronous>b__7(IAsyncResult _) +12 System.Web.Mvc.Async.WrappedAsyncResult1.النهاية() +59 النظام.ويب.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +44
النظام.ويب.Mvc.MvcHandler.النظام.ويب.IHttpAsyncHandler.EndProcessRequest(IAsyncResult نتيجة) +7
النظام.ويب.CallHandlerExecutionStep.النظام.ويب.HttpApplication.IExecutionStep.تنفيذ() +8678910 النظام.ويب.HttpApplication.ExecuteStep(IExecutionStep خطوة منطقية& completedSynchronously) +155

هل كانت مفيدة؟

المحلول

لا يمكنك استخدام [StringLength] عن عقار من نوع آخر من السلسلة.إذا كنت ترغب في تكرار الوظيفة يمكنك فرعية StringLengthAttribute:

public class MyCoolAttribute : StringLengthAttribute {
  // constructor here

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

ثم صفعة [MyCool] بدلا من [StringLength] على الممتلكات الخاصة بك.باستخدام الزهر المشغل في هذا الصدد ربما لا أنظف شيء في العالم ؛ ربما يجب عليك استخدام ToString() أو شيئا من هذا القبيل بدلا من ذلك.ولكن الفكرة هي نفسها.

بدلا من ذلك, إذا كنت لا تريد فرعية StringLengthAttribute ، يمكنك فقط مندوب خاص StringLengthAttribute على سبيل المثال IsValid (طريقة) بدلا من ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top