コールバック jQuery 関数を作成して、いくつかのコレクションを ViewModel に値で埋めます。この関数を再度呼び出すと、ViewModel は最初のコールバックで入力されたコンテンツを失います。
// ----------------------------------------------------
// ViewModel
public class MyViewModel
{
public string SelectedYear { get; set; }
public IEnumerable<Year> Years { get; set; }
public string SelectedCourse { get; set; }
pulbic IEnumerable<Course> Courses { get; set; }
public string SelectedTeacher { get; set; }
pulbic IEnumerable<Teacher> Teachers { get; set; }
// This constructor is called when I create the ViewModel to pass for View in the "New" Controller method call.
public MyViewModel()
{
Years = new List<Year>() {
new Year(1, '2013'),
new Year(2, '2012')
};
Courses = new List<Course>();
Teachers = new List<Teacher>();
}
// ----------------------------------------------------
// View
@model Application.Models.MyViewModel
<div id="content">
@Html.LabelFor(m => m.SelectedYear)
@Html.DropDownListFor(m => m.SelectedYear, new SelectList(Model.Years, "ID", "Description"))
@Html.Partial("Courses", Model)
@Html.Partial("Teachers", Model)
</div>
// ----------------------------------------------------
// Courses PartialView
<div id="courses">
@Html.LabelFor(m => m.SelectedCourse)
@Html.DropDownListFor(m => m.SelectedCourse, new SelectList(Model.Course, "ID", "Name))
</div>
// ----------------------------------------------------
// Teachers PartialView
<div id="teachers">
@Html.LabelFor(m => m.SelectedTeacher)
@Html.DropDownListFor(m => m.SelectedTeacher, new SelectList(Model.Teachers, "ID", "Name))
</div>
// ----------------------------------------------------
// jQuery function - called when I change the selected year.
$('#SelectedYear').change(function() {
$.get('@Url.Action("MethodToRefreshModel", "Controller")', $('#form').serialize(), function (view) {
$('#content').replaceWith(view);
});
});});
// ----------------------------------------------------
// Controller method to refresh courses
public ActionResult MethodToRefreshCourses(MyViewModel model)
{
model.Courses =
(from course in context.Courses
where course.Year.ID == Convert.ToInt64(model.SelectedYear)
select course).ToList();
// Returning my view with the refreshed model
return View("New", model);
}
// Controller method to refresh teachers
public ActionResult MethodToRefreshTeachers(MyViewModel model)
{
model.Teachers =
(from teacher in context.Teachers
where teacher.Course.ID == Convert.ToInt64(model.SelectedCourse)
select teacher).ToList();
// Returning my view with the refreshed model
return View("New", model);
}
メソッドを呼び出してコースを更新すると、ページが返され、正しいデータが表示されます。教師を見つけるためにコースを選択したとき、私のモデルは、別のメソッドに入力されたコースを「失った」ように見えます。誰が何が起こっているのか、それを解決する方法を知っていますか?
皆さん、ありがとうございました!