2014-11-24 7 views
-1

영숫자 문자열을 확인하는 매우 간단한 사용자 지정 유효성 검사 특성을 작성했으며 서버 측에서 작동하지만 클라이언트 측 모델을 사용하려고 할 때 validationContext에 대해 NullReferenceException이 발생합니다 .NET MVC의 유효성 검사. 내 사용자 지정 특성은 MVC 응용 프로그램에서 사용하는 별도의 클래스 라이브러리에 작성됩니다. 속성 및 유효성 검사기 클래스 현재 위치 :사용자 정의 유효성 검사 속성이있는 .NET MVC 오류 클라이언트 쪽

[Required, Display(Name = "Product Code"), AlphaNumeric] 
     public string ProductCode { get; set; } 

가 마지막으로 내가있는 내 컨트롤러가 :

/// <summary> 
    /// Custom validation attribute for an alphanumeric string 
    /// </summary> 
    public class AlphaNumericAttribute : ValidationAttribute 
    { 
     public AlphaNumericAttribute() 
      : base() 
     { 
      ErrorMessage = ValidationMessages.AlphaNumeric; 
     } 

     protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
     { 
      var RegExMatch = ValidationExpressions.AlphaNumeric.Match(value.ToString()); 
      if (!RegExMatch.Success) 
      { 
       return new ValidationResult(this.FormatErrorMessage(validationContext.DisplayName)); 
      } 
      return null; 
     } 
    } 

    /// <summary> 
    /// Custom validator class for the AlphaNumeric attribute defined above. 
    /// </summary> 
    public class AlphaNumericValidator : DataAnnotationsModelValidator<AlphaNumericAttribute> 
    { 
     string errorMsg = string.Empty; 

     public AlphaNumericValidator(ModelMetadata metadata, 
     ControllerContext controllerContext, AlphaNumericAttribute attribute) 
      : base(metadata, controllerContext, attribute) 
     { 
      errorMsg = attribute.ErrorMessage; 
     } 

     public override IEnumerable<ModelClientValidationRule> GetClientValidationRules() 
     { 
      ModelClientValidationRule validationRule = new ModelClientValidationRule(); 
      validationRule.ValidationType = "alphanumeric"; 
      validationRule.ErrorMessage = Attribute.FormatErrorMessage(Metadata.DisplayName); 
      return new[] { validationRule }; 
     } 
    } 

내가 다음 [영숫자] 장식을 사용하여 데이터 주석 내 MVC 응용 프로그램에서 간단한 모델 클래스가 모델 클래스를 통과하고 검증하는 표준 ModelState.IsValid 방법을 사용하여 ... 내 웹 양식에 액세스하여 제출하면

[HttpPost] 
public ActionResult Index(CreateModel Model) 
{ 
    if (ModelState.IsValid) 
    { 
     // Do some stuff 
    } 
    else return View(Model); 
} 

, 나는 즉시 null 참조 예외를 얻을 컨트롤러의 액션 메소드가 호출되기 전에 :

[NullReferenceException: Object reference not set to an instance of an object.] 
    LibData.Validation.AlphaNumericAttribute.IsValid(Object value, ValidationContext validationContext) +75 
    System.ComponentModel.DataAnnotations.ValidationAttribute.GetValidationResult(Object value, ValidationContext validationContext) +29 
    System.Web.Mvc.DataAnnotationsModelValidator.Validate(Object container) +372 
    System.Web.Mvc.<Validate>d__1.MoveNext() +393 
    System.Web.Mvc.DefaultModelBinder.OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext) +401 
    System.Web.Mvc.DefaultModelBinder.BindComplexElementalModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Object model) +123 
    System.Web.Mvc.DefaultModelBinder.BindComplexModel(ControllerContext controllerContext, ModelBindingContext bindingContext) +2541 
    System.Web.Mvc.DefaultModelBinder.BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) +633 
    System.Web.Mvc.ControllerActionInvoker.GetParameterValue(ControllerContext controllerContext, ParameterDescriptor parameterDescriptor) +496 
    System.Web.Mvc.ControllerActionInvoker.GetParameterValues(ControllerContext controllerContext, ActionDescriptor actionDescriptor) +199 
    System.Web.Mvc.Async.<>c__DisplayClass21.<BeginInvokeAction>b__19(AsyncCallback asyncCallback, Object asyncState) +1680 
    System.Web.Mvc.Async.WrappedAsyncResult`1.CallBeginDelegate(AsyncCallback callback, Object callbackState) +59 
    System.Web.Mvc.Async.WrappedAsyncResultBase`1.Begin(AsyncCallback callback, Object state, Int32 timeout) +151 
    System.Web.Mvc.Async.AsyncResultWrapper.Begin(AsyncCallback callback, Object state, BeginInvokeDelegate beginDelegate, EndInvokeDelegate`1 endDelegate, Object tag, Int32 timeout) +94 
    System.Web.Mvc.Async.AsyncControllerActionInvoker.BeginInvokeAction(ControllerContext controllerContext, String actionName, AsyncCallback callback, Object state) +559 
    System.Web.Mvc.Controller.<BeginExecuteCore>b__1c(AsyncCallback asyncCallback, Object asyncState, ExecuteCoreState innerState) +82 
    System.Web.Mvc.Async.WrappedAsyncVoid`1.CallBeginDelegate(AsyncCallback callback, Object callbackState) +73 
    System.Web.Mvc.Async.WrappedAsyncResultBase`1.Begin(AsyncCallback callback, Object state, Int32 timeout) +151 
    System.Web.Mvc.Async.AsyncResultWrapper.Begin(AsyncCallback callback, Object callbackState, BeginInvokeDelegate`1 beginDelegate, EndInvokeVoidDelegate`1 endDelegate, TState invokeState, Object tag, Int32 timeout, SynchronizationContext callbackSyncContext) +105 
    System.Web.Mvc.Controller.BeginExecuteCore(AsyncCallback callback, Object state) +588 
    System.Web.Mvc.Controller.<BeginExecute>b__14(AsyncCallback asyncCallback, Object callbackState, Controller controller) +47 
    System.Web.Mvc.Async.WrappedAsyncVoid`1.CallBeginDelegate(AsyncCallback callback, Object callbackState) +65 
    System.Web.Mvc.Async.WrappedAsyncResultBase`1.Begin(AsyncCallback callback, Object state, Int32 timeout) +151 
    System.Web.Mvc.Async.AsyncResultWrapper.Begin(AsyncCallback callback, Object callbackState, BeginInvokeDelegate`1 beginDelegate, EndInvokeVoidDelegate`1 endDelegate, TState invokeState, Object tag, Int32 timeout, SynchronizationContext callbackSyncContext) +139 
    System.Web.Mvc.Controller.BeginExecute(RequestContext requestContext, AsyncCallback callback, Object state) +484 
    System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.BeginExecute(RequestContext requestContext, AsyncCallback callback, Object state) +50 
    System.Web.Mvc.MvcHandler.<BeginProcessRequest>b__4(AsyncCallback asyncCallback, Object asyncState, ProcessRequestState innerState) +98 
    System.Web.Mvc.Async.WrappedAsyncVoid`1.CallBeginDelegate(AsyncCallback callback, Object callbackState) +73 
    System.Web.Mvc.Async.WrappedAsyncResultBase`1.Begin(AsyncCallback callback, Object state, Int32 timeout) +151 
    System.Web.Mvc.Async.AsyncResultWrapper.Begin(AsyncCallback callback, Object callbackState, BeginInvokeDelegate`1 beginDelegate, EndInvokeVoidDelegate`1 endDelegate, TState invokeState, Object tag, Int32 timeout, SynchronizationContext callbackSyncContext) +106 
    System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) +446 
    System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state) +88 
    System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) +50 
    System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +301 
    System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155 

여기서 내가 무엇을 놓치고 있습니까? 정규 표현식 등의 데이터 주석을 사용하면이 오류가 발생하지 않습니다. MVC 응용 프로그램에서 일종의 처리기를 등록해야합니까? 나는 이것으로 정말 실망 스럽다. 그리고 예, 간단한 간단한 정규 표현식 유효성 검사 속성을이 간단한 것으로 사용할 수 있지만 작성해야 할 더 많은 유효성 검사 속성이 있고 적절하게 연결하는 방법을 이해하고 싶어하므로 문제의 근원을 이해해야합니다. 감사합니다 ...

답변

0

릭, 클라이언트 측에서 작동하려면 몇 가지 추가 작업이 필요합니다. 다음은이를 구현하는 방법에 대한 좋은 자습서입니다. http://thewayofcode.wordpress.com/tag/custom-unobtrusive-validation/

+0

답장을 보내 주셔서 감사합니다. validationContext를 바인딩하는 데 필요한 Html.BeginForm() 도우미를 사용하여 뷰에서 내 양식을 만들지 않았기 때문에 폭탄을 터뜨린 것은 서버 측 유효성 검사였습니다. 난 그냥 내 자신의 양식 태그를 만드는 중이 었어. –

+0

나는 너무 빨리 말했습니다. 나는 여전히 사용자 정의 속성을 사용하는 데있어 오류가 발생하며 서버 측 유효성 검사 만 수행하려고합니다. –

+0

@RickClift - 반환 값을 null에서 IsValid 메서드의 ValidationResult 개체로 변경해야 할 수도 있습니다. null 대신 항상 객체를 반환해야합니다. – Eduardo