Asp.Net MVC: заполните свойство модели из ActionFilterAttribute OnActionExecuting

Я внедряю контроль капчи для потерянного пароля на веб-сайте, как описано здесь

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

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

Так как:

  • У меня строго типизированное представление с валидаторами
  • В тот день, когда я изменю имя свойства, не помня это строковое поле, оно не сработает.

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

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

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

E.g: MyModel.IsCaptchaValid = recaptchaResponse.IsValid;

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

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

person J4N    schedule 21.03.2012    source источник


Ответы (2)


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

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

Затем вы можете проверить ModelState.IsValid в своем действии (что вы все равно должны делать)

person Macros    schedule 21.03.2012
comment
Хм! Это очень интересно! Я не знал, что могу напрямую изменить состояние проверки! Здорово! Спасибо! что мне было нужно - person J4N; 21.03.2012

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

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

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);
}
person danludwig    schedule 21.03.2012