【问题标题】:MVC3 Remote Validation of a field within an IEnumerableIEnumerable 中字段的 MVC3 远程验证
【发布时间】:2012-03-19 05:56:48
【问题描述】:

我的模型类的 IEnumerable 中有一个对象,呈现的 HTML 看起来像

<input data-val="true" data-val-number="The field money must be a number." data-val-remote="&amp;#39;money&amp;#39; is invalid." data-val-remote-additionalfields="*.money" data-val-remote-url="/RemoteValidator/ValidateMoney" data-val-required="The money field is required." id="BudgetDetails_0__BudgetData_Money" name="BudgetDetails[0].BudgetData.Money" type="text" value="100" />
<span class="field-validation-valid" data-valmsg-for="BudgetDetails[0].BudgetData.Money" data-valmsg-replace="true"></span>

模型类看起来像

public class MyViewModel
{
    public IEnumerable<Budget> BudgetDetails { get; set; }
}

public class Budget
{
    public int SomeIdentifier { get; set; }
    public BudgetValues BudgetData { get; set; }
}

public class BudgetValues
{
    [Remote("ValidateMoney", "RemoteValidator")]
    public decimal? Money { get; set; }

    // other properties
}

查看是

@model DictionaryAndRemote.Models.MyViewModel
<!DOCTYPE html>
<html>
<head>
    <title>Index</title>
    <script src="@Url.Content("~/Scripts/jquery-1.5.1.js")" type="text/javascript"></script>
    <script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
    <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>
    <script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.js")" type="text/javascript"></script>
</head>
<body>
    @using (Html.BeginForm())
    {
        @Html.EditorFor(x => x.BudgetDetails)
        <br />
        <input type="submit" value="Submit user Data" />
    }
</body>
</html>

编辑模板Views\Shared\EditorTemplates\Budget.cshtml

@model DictionaryAndRemote.Models.Budget
<div id="@Model.SomeIdentifier.ToString()">
    <div>
        @Html.TextBoxFor(x => x.BudgetData.Money)
        @Html.ValidationMessageFor(x => x.BudgetData.Money)
    </div>
</div>

UI 将触发 Ajax 调用 http://localhost:4276/RemoteValidator/ValidateMoney?BudgetDetails%5B0%5D.BudgetData.Money=500 但不幸的是路由表无法将请求与我的操作方法匹配

    public ActionResult ValidateMoney(decimal money)
    {
        return Json("I will always fail you.", JsonRequestBehavior.AllowGet);
    }

因为参数名称不匹配。由于 is 在 IEnumerable 内部,因此参数名称甚至是动态的 BudgetDetails[0].BudgetData.MoneyBudgetDetails[1].BudgetData.Money 等等。

当然,我总是可以将动作方法调整为

    public ActionResult ValidateMoney()
    {
        string parameter = Request.QueryString.ToString();
        return Json("I will always fail you.", JsonRequestBehavior.AllowGet);
    }

并使用非常原始的方式来解析查询字符串,但我认为这不是最优雅的解决方案。

有人有经验可以分享吗?

【问题讨论】:

    标签: asp.net-mvc-3 ienumerable remote-validation


    【解决方案1】:

    试试这个方法。

    public JsonResult ValidateMoney([Bind(Include = "Money")]BudgetValues budgetValues)
    {
     if(null != budgetValues)
     {
      decimal money = budgetValues.Money 
     }
     return Json("I will always fail you.", JsonRequestBehavior.AllowGet); 
    }
    

    【讨论】:

    • 不起作用,因为传入的请求例如包含BudgetDetails%5b0%5d.BudgetData.Money=100,并且永远无法绑定到money参数,因此该值始终为null。
    • 您的 ValidateMoney 模型如何?只是这个简单的 BudgetValues 类?在视图中做什么?
    • 不,我试过了,但没用,我猜是绑定不能正确处理索引器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多