У меня есть объект внутри IEnumerable
моего модельного класса, визуализированный HTML выглядит как
<input data-val="true" data-val-number="The field money must be a number." data-val-remote="&#39;money&#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>
Пользовательский интерфейс вызовет вызов 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.Money
, BudgetDetails[1].BudgetData.Money
и т. Д.
Конечно, я всегда могу настроить действие так, чтобы оно было
public ActionResult ValidateMoney()
{
string parameter = Request.QueryString.ToString();
return Json("I will always fail you.", JsonRequestBehavior.AllowGet);
}
И использоватьочень примитивный способ разбора строки запроса, но я не думаю, что это самое элегантное решение.
У кого-нибудь есть опыт, которым можно поделиться?