Asp.Net MVC: заполнить свойство модели из ActionFilterAttribute OnActionExecuting - PullRequest
0 голосов
/ 21 марта 2012

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

Но я чувствую себя очень некомфортно с `

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

Поскольку:

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

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

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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 21 марта 2012

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

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

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

0 голосов
/ 21 марта 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);
}
...