读取值并在“过滤器属性”中添加错误

时间:2013-12-11 16:50:53

标签: asp.net-mvc

我有以下ASP.NET MVC过滤器属性:

public void OnActionExecuting(ActionExecutingContext context) {
  ControllerBase controller = context.Controller;      
} 

在视图中,我有一个带

的表单
@Html.TextBox("Captha");

我的模特是:

public class SignUpModel {
  public String Email { get; set; }
  public String Password { get; set; }
  public String Captcha { get; set; }
}

我如何在我的过滤器属性中执行以下操作:

  1. 在文本框中插入值;

  2. 如果没有值或特定条件为假,则向模型状态添加错误?

  3. 我的模型中是否需要验证码属性?

  4. 谢谢你, 米格尔

1 个答案:

答案 0 :(得分:1)

您不需要ActionFilter来执行此操作。在模型中使用CompareAttribute来验证Captcha属性。将另一个属性添加到模型中,并将其命名为SessionValue,然后使用CompareAttribute将为Captcha属性输入的值与SessionValue属性进行比较:

public class SignUpModel {
    public string Email { get; set; }
    public string Password { get; set; }
    [Compare("SessionValue")]
    public string Captcha { get; set; }
    public string SessionValue { get; set; }
}

然后,在您的Controller操作中,将SessionValue属性的值设置为会话中存储的值:

var model = new SignUpModel();
model.SessionValue = Session["MyValue"];
return View(model);

而且,在您的视图中,您将拥有:

@Html.HiddenFor(model => model.SessionValue)
@Html.TextBoxFor(model => model.Captcha)
@Html.ValidationMessageFor(model => model.Captcha)

<强>更新

如果您不想在视图中将SessionValue作为隐藏输入,则可以创建如下自定义验证属性:

using System.ComponentModel.DataAnnotations;
using System.Web;

public class MyCustomValidationAttribute : ValidationAttribute
{
    public override bool IsValid(object value)
    {
        if (value == null)
            return true;

        string compareValue = HttpContext.Current.Session["MyValue"];

        return (string)value.Equals(compareValue);
    }
}

并且,在您的模型中使用它:

public class SignUpModel {
    public string Email { get; set; }
    public string Password { get; set; }
    [Required]
    [MyCustomValidation]
    public string Captcha { get; set; }
}