2012-03-21 3 views
0

Я осуществляет контроль капчи за утраченное пароль на веб-сайте, как описано hereAsp.Net MVC: Наполните свойство модели из ActionFilterAttribute OnActionExecuting

Но я чувствую себя очень unconfortable с `

filterContext.ActionParameters ["captchaValid"] = recaptchaResponse.IsValid;

Потому что:

  • Я сильно типизированный, с валидаторами
  • На следующий день я изменить имя свойства без запоминания этой строки поля, оно не будет работа.

Так что я искал, как изменить атрибут моей модели в ActionFilterAttribute, в OnActionExecuting, потому что мои действия контроллера будут нужны эти данные. Я нашел this, но не может работать для меня, так как мне нужна модель, которая должна быть установлена ​​ПЕРЕД выполнением действия.

Поэтому я подумал, что могу добавить «переменную сообщения», которая будет считываться с помощью связующего устройства модели, но кажется, что filterContext.HttpContext.Request.Form находится в режиме только для чтения.

Итак, как вы думаете, я могу привести результат в мою модель?

например: MyModel.IsCaptchaValid = recaptchaResponse.IsValid;

событий, если я не могу не указать поле свойства, это лучше, чем сейчас:

filterContext.Something.Else["ModelKey"] = recaptchaResponse.IsValid;; 

ответ

2

Как насчет добавления ошибки в ModelState например,

filterContext.Controller.ViewData.ModelState.AddModelError("", ""Captcha response invalid") 

Вы можете проверить ModelState.IsValid в ваших действиях (которые вы должны делать в любом случае)

+0

Hum! Это очень интересно! Я не был жестким, что могу напрямую изменить состояние проверки! Большой! Спасибо! Что мне нужно – J4N

0

На следующий день я изменить имя свойства, не помня эту строку поля, он выиграл» т работ.

Если вас беспокоит изменение имени свойства/строки, нарушающего функциональные возможности, вы можете выполнить проверку вашего пользовательского атрибута.

public void CaptchaValidatorAttribute_SetsActionParameter_ForCaptchaValidity() 
{ 
    // arrange 
    var filterContext = new ActionExecutingContext 
    { 
     ActionParameters = new Dictionary<string, object>() 
     // ... other arrangements, like mocking HttpContextBase and HttpRequestBase 
    }; 
    var actionFilter = new CaptchaValidatorAttribute(); 

    // act 
    actionFilter.OnActionExecuting(filterContext); 

    // assert 
    Assert.AreEqual(filterContext.ActionParameters.ContainsKey("captchaValid"), 
     true); 
}