Asp.net mvc 3 我可以在MVC3中重用远程验证操作吗

Asp.net mvc 3 我可以在MVC3中重用远程验证操作吗,asp.net-mvc-3,validation,Asp.net Mvc 3,Validation,我正在视图模型上使用远程验证属性验证为我的公司指定的银行帐户: 视图模型: [Remote("CheckDefaultBank", "Company")] public string DefaultBank { 在控制器中,我有: [HttpGet] public JsonResult CheckDefaultBank(string defaultBank) { bool result = BankExists(defaultBank);

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

视图模型:

[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上使用参数say“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);
    }

可能吗?

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


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

对于这种情况,我编写了一个
RemoteReusableAttribute
,这可能对您有所帮助。这里有一个链接:

考虑将逻辑“BankExists”封装到ValidationAttribute(数据注释验证器)中。这也允许其他场景

然后使用下面这样的包装器ActionResult,它允许您传入任何验证器

[HttpGet]
public ActionResult CheckRefundBank(string refundBank)
{
    var validation = BankExistsAttribute();
    return new RemoteValidationResult(validation, defaultBank);
}
下面是ActionResult的代码,它通常与验证器一起工作

    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);
        }
    }

作为一个额外的增强,考虑创建一个控制器扩展方法来干涸你的返回呼叫更多。< /P>简单的好主意。我包含了多个参数,只使用了一个null合并操作符来获得一个非null的值。非常好!您是否考虑过将其扩展到包含多个字段(通过AdditionalFields参数)的情况,这些字段都需要通用名称?