0

我正在为网站中丢失的密码实施验证码控制,如此处所述

但是我觉得很不舒服`

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

因为:

  • 我有一个强类型视图,带有验证器
  • 那天我会更改属性名称而不记住这个字符串字段,它不会起作用。

所以我搜索了如何在 中编辑我的模型的属性ActionFilterAttributeOnActionExecuting因为我的控制器操作将需要这些数据。我找到了这个,但对我不起作用,因为我需要在执行操作之前设置模型。

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

那么你认为我如何将结果放入我的模型中?

例如:MyModel.IsCaptchaValid = recaptchaResponse.IsValid;

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

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

2 回答 2

2

如何向 ModelState 添加错误,例如

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

然后,您可以在您的操作中检查 ModelState.IsValid (无论如何您都应该这样做)

于 2012-03-21T11:04:46.550 回答
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);
}
于 2012-03-21T11:33:20.707 回答