Asp.Net MVC:从ActionFilterAttribute OnActionExecuting填充模型属性

时间:2012-03-21 10:56:41

标签: asp.net-mvc validation asp.net-mvc-validation

我正在为网站中丢失的密码实施验证码控件,如here

所述

但我对'

感到非常不安
  

filterContext.ActionParameters [“captchaValid”] =   recaptchaResponse.IsValid;

由于:

  • 我有一个强类型视图,带有验证器
  • 我将在不记住此字符串字段的情况下更改属性名称的那一天,它将无效。

因此,我在ActionFilterAttribute OnActionExecuting中搜索了如何编辑模型的属性,因为我的控制器操作需要此数据。 我找到了this,但是对我来说不行,因为我需要在动作执行之前设置模型。

所以我认为我可以添加一个“Post变量”,它将由模型绑定器读取,但似乎filterContext.HttpContext.Request.Form处于只读模式。

那你怎么认为我可以把结果放在我的模型中?

例如:MyModel.IsCaptchaValid = recaptchaResponse.IsValid;

如果我无法避免指定属性字段的事件,它比现在好:

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

2 个答案:

答案 0 :(得分:2)

如何向ModelState添加错误,例如

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

然后你可以在你的行动中检查ModelState.IsValid(无论如何你都应该这样做)

答案 1 :(得分: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);
}