2011-11-22 66 views
2

我使用我的视图模型远程验证属性来验证这是对我公司指定的银行账户远程验证动作:我可以重用在MVC3

视图模型:

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

可能吗?

回答

2

由于MVC使用默认的模型联编程序,就像正常的操作方法一样。您可以将FormsCollection作为参数并查找值。但是,我个人会发现,仅仅使用几个参数来实现这个功能要容易得多,除非你开始有几十个不同的参数。

您也可以编写一个自定义模型联编程序,它将传递的参数转换为通用参数。

+0

好简单的想法。我包含了多个参数,只是使用空合并运算符来获取非空合并值。 – PilotBob

3

就在这样的情况下,我写了一个RemoteReusableAttribute,这可能对您有所帮助。这里是它的链接:Custom remote Validation in MVC 3

+0

非常好!你是否考虑过扩展它以包含多个字段都被传递的情况(通过AdditionalFields参数),这些字段都需要通用名称? –

2

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

然后使用如下面的包装器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); 
     } 
    } 

作为一个额外的增强考虑创建一个控制器扩展方法来干你的回报更多。

相关问题