Я следую этому стандартному шаблону за использование Ajax для перезагрузки частичного представления.Однако, когда частичное представление перезагружается, элементы управления в представлении имеют разные идентификаторы.Они теряют название родительской модели.Это означает, что когда форма отправляется обратно, привязка модели не будет работать.
Таким образом, в приведенном ниже примере, когда страница загружается в первый раз, идентификатором флажка является «PenguinEnclosure_IsEnoughPenguins», но после частичной перезагрузки,идентификатор флажка «IsEnoughPenguins» Идентификатор должен быть «PenguinEnclosure_IsEnoughPenguins» для привязки модели, чтобы правильно связать это со свойством PenguinEnclosure виртуальной машины.
Модель:
public class ZooViewModel
{
public string Name { get; set; }
public PenguinEnclosureVM PenguinEnclosure { get; set; }
}
public class PenguinEnclosureVM
{
public int PenguinCount { get; set; }
[Display(Name = "Is that enough penguins for you?")]
public bool IsEnoughPenguins { get; set; }
}
Контроллер:
public ActionResult Index()
{
var vm = new ZooViewModel
{
Name = "Chester Zoo",
PenguinEnclosure = new PenguinEnclosureVM { PenguinCount = 7 }
};
return View(vm);
}
public ActionResult UpdatePenguinEnclosure(int penguinFactor)
{
return PartialView("DisplayTemplates/PenguinEnclosureVM", new PenguinEnclosureVM { PenguinCount = penguinFactor * 10 });
}
Вид:
@model PartialProblem.Models.ZooViewModel
@Scripts.Render("~/bundles/jquery")
<p>
Welcome to @Model.Name !
</p>
<p>
<div id="penguin">
@Html.DisplayFor(m => m.PenguinEnclosure)
</div>
</p>
<button id="refresh">Refresh</button>
<script>
$(document).ready(function () {
$("#refresh").on("click", function () {
$.ajax({
url: "/Home/UpdatePenguinEnclosure",
type: "GET",
data: { penguinFactor: 42 }
})
.done(function (partialViewResult) {
$("#penguin").html(partialViewResult);
});
});
});
</script>
Частичный вид:
@model PartialProblem.Models.PenguinEnclosureVM
<p>
We have @Model.PenguinCount penguins
</p>
<p>
@Html.LabelFor(m => m.IsEnoughPenguins)
@Html.CheckBoxFor(m => m.IsEnoughPenguins)
</p>