我正在为网站中丢失的密码实施验证码控件,如here
所述但我对'
感到非常不安filterContext.ActionParameters [“captchaValid”] = recaptchaResponse.IsValid;
由于:
因此,我在ActionFilterAttribute
OnActionExecuting
中搜索了如何编辑模型的属性,因为我的控制器操作需要此数据。
我找到了this,但是对我来说不行,因为我需要在动作执行之前设置模型。
所以我认为我可以添加一个“Post变量”,它将由模型绑定器读取,但似乎filterContext.HttpContext.Request.Form
处于只读模式。
那你怎么认为我可以把结果放在我的模型中?
例如:MyModel.IsCaptchaValid = recaptchaResponse.IsValid;
如果我无法避免指定属性字段的事件,它比现在好:
filterContext.Something.Else["ModelKey"] = recaptchaResponse.IsValid;;
答案 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);
}