0

モデル クラス内にオブジェクトがあり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 内にあるため、パラメーター名は dynamicBudgetDetails[0].BudgetData.MoneyなどBudgetDetails[1].BudgetData.Moneyです。

もちろん、私はいつでもアクション方法を微調整することができます

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

また、クエリ文字列を解析するために非常に原始的な方法を使用しますが、それが最もエレガントなソリューションだとは思いません。

共有する経験がある人はいますか?

4

1 に答える 1

0

この方法を試してください。

public JsonResult ValidateMoney([Bind(Include = "Money")]BudgetValues budgetValues)
{
 if(null != budgetValues)
 {
  decimal money = budgetValues.Money 
 }
 return Json("I will always fail you.", JsonRequestBehavior.AllowGet); 
}
于 2012-02-29T22:21:38.503 に答える