2

患者オブジェクトと Visits コレクションで構成されるビュー モデルがあります。ビュー モデルにはすべての正しいプロパティ値が取り込まれ、プロパティは編集ビューに正しく表示されます。また、モデルがコントローラーの編集 (GET) アクションでビューに渡される前に、ビュー モデルのプロパティ値を確認しました。

問題は、編集ビューでプロパティを変更しない場合でも、ドロップダウン リスト (性別と状態) にバインドされたプロパティがコントローラーの編集 (POST) アクションに戻されないことです。これにより、例外がスローされます。

プロパティには値がありますが、どこかで失われています。これをトラブルシューティングするにはどうすればよいですか?

ASP.NET MVC 4 RC

public ActionResult Edit(int id = 0)
{
    var patient = this.db.Patients.Where(p => p.Id == id).FirstOrDefault();
    var visits = this.db.Visits.Where(v => v.PatientId == patient.Id && v.IsActive).OrderByDescending(v => v.VisitDate);

    PatientEditViewModel model = new PatientEditViewModel();
    model.Patient = patient;
    model.Visits = visits;

    if (patient == null)
    {
        return this.HttpNotFound();
    }

    ViewBag.GenderId = new SelectList(this.db.Genders, "Id", "Name", patient.GenderId);
    ViewBag.HandednessId = new SelectList(this.db.Handednesses, "Id", "Name", patient.HandednessId);

    return this.View(model);
}


[HttpPost]
public ActionResult Edit(PatientEditViewModel model)
{
    Mapper.CreateMap<PatientEditViewModel, Patient>();

    var entity = Mapper.Map<PatientEditViewModel, Patient>(model);

    if (ModelState.IsValid)
    {
        this.db.Entry(entity).State = EntityState.Modified;
        this.db.SaveChanges();
    }

    this.ViewBag.GenderId = new SelectList(this.db.Genders, "Id", "Name", entity.GenderId);
    this.ViewBag.HandednessId = new SelectList(this.db.Handednesses, "Id", "Name", entity.HandednessId);

    return this.View(model);
}

@model Web.Models.PatientEditViewModel

@{
    ViewBag.Title = "XXX";
}


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

    <fieldset>
        <legend>Patient</legend>

        @Html.HiddenFor(model => model.Patient.Id)

        <div class="editor-label">
            @Html.LabelFor(model => model.Patient.GenderId, "Gender")
        </div>
        <div class="editor-field">
            @Html.DropDownFor("GenderId", String.Empty)
            @Html.ValidationMessageFor(model => model.Patient.GenderId)
        </div>
        <div class="editor-label">
            @Html.LabelFor(model => model.Patient.HandednessId, "Handedness")
        </div>
        <div class="editor-field">
            @Html.DropDownFor("HandednessId", String.Empty)
            @Html.ValidationMessageFor(model => model.Patient.HandednessId)
        </div>
        <div class="editor-label">
            @Html.LabelFor(model => model.Patient.Comments)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Patient.Comments)
            @Html.ValidationMessageFor(model => model.Patient.Comments)
        </div>

        <p>
            <input type="submit" value="Save" />
        </p>
    </fieldset>
}

@Html.Partial("_CurrentAndPreviousVisits", Model.Visits)


@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")


}
4

1 に答える 1

4

Html.DropDownForヘルパーはいません。多分あなたはHtml.DropDownListまたはを意味しHtml.DropDownListForました。個人的には、2番目の強く型付けされたバージョンをお勧めします。

したがって、PatientEditViewModelモデルで次のプロパティを定義します。

public string GenderId { get; set; }
public IEnumerable<SelectList> Genders { get; set; }

public string HandednessId { get; set; }
public IEnumerable<SelectList> Handednesses { get; set; }

次に、コントローラーアクションで、ビューモデルを忘れてViewBag、適切に入力します。したがって、ViewBagの2行を2行のビューモデル割り当てに置き換えます。

model.Genders = new SelectList(this.db.Genders, "Id", "Name", patient.GenderId);
model.Handednesses = new SelectList(this.db.Handednesses, "Id", "Name", patient.HandednessId);

そして、あなたの見解では、強く型付けされたバージョンのヘルパーを使用します。

@Html.DropDownListFor(x => x.GenderId, Model.Genders)

と:

@Html.DropDownListFor(x => x.HandednessId, Model.Handednesses)

GenderIdこれで、POSTアクション内で、ビューモデルのHandednessIdプロパティ内の2つの選択された値を取得します。明らかに、POSTアクションで同じビューを再表示する場合は、2行のビューモデルプロパティが割り当てられた2行のViewCrap(申し訳ありませんがViewBagを意味します)を削除します。

于 2012-07-16T20:44:15.403 に答える