我有以下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; }
}
我如何在我的过滤器属性中执行以下操作:
在文本框中插入值;
如果没有值或特定条件为假,则向模型状态添加错误?
我的模型中是否需要验证码属性?
谢谢你, 米格尔
答案 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; }
}