我可以在MVC3中重用远程验证操作吗?

时间:2011-11-22 18:18:35

标签: asp.net-mvc-3 validation

我在我的视图模型上使用远程验证属性来验证为我的公司指定的银行帐户:

视图模型:

[Remote("CheckDefaultBank", "Company")]
    public string DefaultBank
    {

这在控制器中我有:

    [HttpGet]
    public JsonResult CheckDefaultBank(string defaultBank)
    {
        bool result = BankExists(defaultBank);
        return Json(result, JsonRequestBehavior.AllowGet);
    }

这一切都运作良好。但是,我还有另外两家与我公司有关的银行。但是,当远程验证js调用该操作时,它使用一个参数来控制字段名称“DefaultBank”...所以我在操作中将其用作参数。

我是否可以在视图中添加一些属性,以便在ajax get上使用“bankId”参数,这样我就不需要对每个字段执行基本完全相同的操作了?

这里的目标是消除现在必须在我的控制器中拥有它:

[HttpGet]
    public JsonResult CheckRefundBank(string refundBank)
    {
        bool result = BankExists(defaultBank);
        return Json(result, JsonRequestBehavior.AllowGet);
    }

[HttpGet]
    public JsonResult CheckPayrollBank(string payrollBank)
    {
        bool result = BankExists(defaultBank);
        return Json(result, JsonRequestBehavior.AllowGet);
    }

我希望我能在视图中做到这样的事情:

@Html.EditorFor(model => model.DefaultBank, new { data-validate-parameter: bankId })

这样我就可以对所有银行条目使用相同的操作,例如:

[HttpGet]
    public JsonResult CheckValidBank(string bankId)
    {
        bool result = BankExists(bankId);
        return Json(result, JsonRequestBehavior.AllowGet);
    }

可能的?

3 个答案:

答案 0 :(得分:3)

对于这种情况,我写了RemoteReusableAttribute,这可能对你有所帮助。以下是指向它的链接:Custom remote Validation in MVC 3

答案 1 :(得分:2)

由于MVC使用默认的模型绑定器,就像普通的操作方法一样。您可以将FormsCollection作为参数并查找值。但是,我个人会发现只使用几个参数更容易,除非你开始有几十个不同的参数。

您还可以编写自定义模型绑定器,将传递的参数转换为通用参数。

答案 2 :(得分:2)

考虑将逻辑“BankExists”封装到ValidationAttribute(Data Annotations Validator)中。这也允许其他场景。

然后使用如下所示的包装器ActionResult,它允许您传入任何验证器。

[HttpGet]
public ActionResult CheckRefundBank(string refundBank)
{
    var validation = BankExistsAttribute();
    return new RemoteValidationResult(validation, defaultBank);
}

以下是ActionResult的代码,它与Validators一起使用。

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

    public class RemoteValidationResult : ActionResult
    {
        public RemoteValidationResult(ValidationAttribute validation, object value)
        {
            this.Validation = validation;
            this.Value = value;
        }

        public ValidationAttribute Validation { get; set; }

        public object Value { get; set; }

        public override void ExecuteResult(ControllerContext context)
        {
            var json = new JsonResult();
            json.JsonRequestBehavior = JsonRequestBehavior.AllowGet;

            if (Validation.IsValid(Value))
            {
                json.Data = true;
            }
            else
            {
                json.Data = Validation.FormatErrorMessage(Value.ToString());
            }

            json.ExecuteResult(context);
        }
    }

作为额外的增强功能,请考虑创建一个控制器扩展方法,以便让您的回访更加干涸。