0

コールバック 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);
}

メソッドを呼び出してコースを更新すると、ページが返され、正しいデータが表示されます。教師を見つけるためにコースを選択したとき、私のモデルは、別のメソッドに入力されたコースを「失った」ように見えます。誰が何が起こっているのか、それを解決する方法を知っていますか?

皆さん、ありがとうございました!

4

1 に答える 1

0

jquery select要素変更イベントでは、関数をバインドしています。この関数は、単一の値のみを返す関数を呼び出し(actionmethodをdeubgして、どの値がモデルオブジェクトにあるかを確認します)、その後、コンテンツ全体を置き換えますコンテンツ div の ( $('#content').replaceWith(view);)。

コンテンツ div 全体ではなく、目的のコントロールのみをバインドする必要があります。

于 2013-01-17T12:12:26.033 に答える