4

私は MVC を初めて使用するので、ご容赦ください。ただし、MVC 4 でのポストバック中に、SelectList の値を選択したオブジェクトのインスタンスにバインドできないようです。

School のメンバーとして Teacher を作成する必要があるとします。次のように定義された ViewModel クラスがあります。

public class RegisterTeacherModel
{
    [Required]
    [Display(Name = "User name")]
    public string UserName { get; set; }

    [Required]
    [DataType(DataType.EmailAddress)]
    [Display(Name = "Email address")]
    public string Email { get; set; }

    [Required]
    [Display(Name = "School")]
    public School SelectedSchool { get; set; }

    [ScaffoldColumn(false)]
    public Guid UserId
    {
        get;
        set;
    }

    public SelectList PossibleSchools
    {
        get;
        private set;
    }

    public RegisterTeacherModel(IRepository<School> schoolRepo)
    {
        PossibleSchools = new SelectList(schoolRepo, "Id", "Name");
    }
}

そして私の見解:

@using (Html.BeginForm()) {
@Html.ValidationSummary(true)

<fieldset>
    <legend>RegisterTeacherModel</legend>

    <div class="editor-label">
        @Html.LabelFor(model => model.UserName)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.Email)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.Email)
        @Html.ValidationMessageFor(model => model.Email)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.SelectedSchool)
    </div>
    <div class="editor-field">
        @Html.DropDownListFor(model => model.SelectedSchool, Model.PossibleSchools)
    </div>
    <p>
        <input type="submit" value="Create" />
    </p>
</fieldset>
}

そして最後に、私の Controller メソッド:

    [HttpPost, ActionName("Create")]
    public ActionResult CreateTeacher(RegisterTeacherModel teacherModel)
    {
        if (ModelState.IsValid)
        {
            try
            {
              ...
            }
         }
    }

しかし、Controller の Create メソッドで RegisterTeacherModel オブジェクトを受け取ると、SelectedSchool は常に null です。モデル バインダーがポストバック時にオブジェクト参照を再作成する方法に何か欠けているに違いありません。誰かが私を正しい方向に向けることができますか?

4

2 に答える 2

3

2 番目の投稿で触れたと思います: 最初のコードを Model.SelectedSchool に向けてみてください。<IdProperty>

<div class="editor-field">
  @Html.DropDownListFor(model => model.SelectedSchool.**<IdProperty>**, Model.PossibleSchools)
</div>
于 2012-11-29T20:50:51.510 に答える
2

さて、私は回避策を見つけました。何か不足しているかどうかはまだわかりませんが、ViewModel で School オブジェクトを使用する代わりに、SelectedSchoolId に置き換えました。

public class RegisterTeacherModel
{
    [Required]
    [Display(Name = "User name")]
    public string UserName { get; set; }

    [Required]
    [DataType(DataType.EmailAddress)]
    [Display(Name = "Email address")]
    public string Email { get; set; }

    [Required]
    [Display(Name = "School")]
    public int SelectedSchoolId { get; set; }

    ...
}

ビューのドロップダウンを変更して、代わりにこれを使用します。

<div class="editor-field">
    @Html.DropDownListFor(model => model.SelectedSchoolId, Model.PossibleSchools)
</div>

次に、コントローラーで実際のモデル オブジェクトを作成するときに、School オブジェクトを School リポジトリから取得して、それを実際の Teacher オブジェクトに関連付けるだけです。

于 2012-07-22T17:54:36.377 に答える