Asp.net mvc Asp.Net MVC:从ActionFilterAttribute到ActionExecuting填充模型属性

Asp.net mvc Asp.Net MVC:从ActionFilterAttribute到ActionExecuting填充模型属性,asp.net-mvc,validation,asp.net-mvc-validation,Asp.net Mvc,Validation,Asp.net Mvc Validation,我正在为网站中丢失的密码实施验证码控制,如所述 但我觉得自己很不适应这种情况` filterContext.ActionParameters[“captchaValid”]= RecaptCharResponse.IsValid 因为: 我有一个强类型视图,带有验证器 有一天我会在不记住这个字符串字段的情况下更改属性名,它将不起作用 因此,我在ActionFilterAttribute和OnActionExecuting中搜索了如何编辑我的模型属性,因为我的控制器操作需要这些数据。 我找到了

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

但我觉得自己很不适应这种情况`

filterContext.ActionParameters[“captchaValid”]= RecaptCharResponse.IsValid

因为:

  • 我有一个强类型视图,带有验证器
  • 有一天我会在不记住这个字符串字段的情况下更改属性名,它将不起作用
因此,我在
ActionFilterAttribute
OnActionExecuting
中搜索了如何编辑我的模型属性,因为我的控制器操作需要这些数据。 我找到了,但无法为我工作,因为我需要在执行操作之前设置模型

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

那么你认为我怎样才能把结果放在我的模型中呢

例如:
MyModel.IsCaptchaValid=recaptchaResponse.IsValid

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

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

向ModelState添加一个错误如何

filterContext.Controller.ViewData.ModelState.AddModelError("", ""Captcha response invalid")
然后,您可以在您的操作中检查ModelState.IsValid(您无论如何都应该这样做)

总有一天我会在不记住这一点的情况下更改财产名称 字符串字段,它将不起作用

如果您担心属性/字符串名称的更改会破坏功能,可以对自定义属性进行单元测试

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);
}
public void CaptchaValidatorAttribute_setActionParameter_forCAPTCHAValidation()
{
//安排
var filterContext=新建ActionExecutingContext
{
ActionParameters=新字典()
//…其他安排,如模拟HttpContextBase和HttpRequestBase
};
var actionFilter=new captchavalidater属性();
//表演
onActionFilter.OnActionExecuting(filterContext);
//断言
Assert.AreEqual(filterContext.ActionParameters.ContainsKey(“captchaValid”),
正确的);
}

哼!这很有趣!我没有硬性要求我可以直接修改验证状态!伟大的非常感谢。我需要什么