0

メソッドを使用してコントローラーのアクション (注釈付き) にPOSTデータを送信するフォームがあります。アクション シグネチャは. 問題は、ビューの画面にすべてのプロパティが入力されているにもかかわらず、一部のプロパティのみが入力されることです。データがテキスト ボックスに入力されるプロパティのみが設定されます。ドロップダウンリストからの値はどれもモデルに渡されていません。Create[HttpPost]VisitVisit

ここで何が起こっているのですか?ありがとう!

MVC4 ベータ版。

更新 1-ビューで使用されるフォーム...

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

    <fieldset>
        <legend>Visit</legend>
            <div class="editor-label">
                @Html.LabelFor(model => model.Visit.VisitDate)
            </div>
            <div class="editor-field">
                @Html.TextBoxFor(model => model.Visit.VisitDate, new { @class = "editor-field-medium" })
                @Html.ValidationMessageFor(model => model.Visit.VisitDate)
            </div>
            <div class="editor-label">
                @Html.LabelFor(model => model.Visit.NPN)
            </div>
            <div class="editor-field">
                @Html.TextBoxFor(model => model.Visit.NPN, new { @class = "editor-field-medium" })
                @Html.ValidationMessageFor(model => model.Visit.NPN)
            </div>
            <div class="editor-label">
                @Html.LabelFor(model => model.Visit.AppointmentTypeId)
            </div>
            <div class="editor-field"> @* THIS DOES NOT GET POPULATED WHEN PASSED TO THE ACTION*@
                @Html.DropDownList("AppointmentTypeId", String.Empty)
                @Html.ValidationMessageFor(model => model.Visit.AppointmentTypeId)
            </div>
            <div class="editor-label">
                @Html.LabelFor(model => model.Visit.EducationId)
            </div>
            <div class="editor-field"> @* THIS DOES NOT GET POPULATED WHEN PASSED TO THE ACTION*@
                @Html.DropDownList("EducationId", String.Empty)
                @Html.ValidationMessageFor(model => model.Visit.EducationId)
            </div>
            <div class="editor-label">
                @Html.LabelFor(model => model.Visit.PsychologistId)
            </div>
            <div class="editor-field"> @* THIS DOES NOT GET POPULATED WHEN PASSED TO THE ACTION*@
                @Html.DropDownList("PsychologistId", String.Empty)
                @Html.ValidationMessageFor(model => model.Visit.PsychologistId)
            </div>
            <div class="editor-label">
                @Html.LabelFor(model => model.Visit.PsychometristId)
            </div>
            <div class="editor-field"> @* THIS DOES NOT GET POPULATED WHEN PASSED TO THE ACTION*@
                @Html.DropDownList("PsychometristId", String.Empty)
                @Html.ValidationMessageFor(model => model.Visit.PsychometristId)
            </div>
            <div class="editor-label">
                @Html.LabelFor(model => model.Visit.PostDoctoralId)
            </div>
            <div class="editor-field"> @* THIS DOES NOT GET POPULATED WHEN PASSED TO THE ACTION*@
                @Html.DropDownList("PostDoctoralId", String.Empty)
                @Html.ValidationMessageFor(model => model.Visit.PostDoctoralId)
            </div>
            <div class="editor-label">
                @Html.LabelFor(model => model.Visit.BehavioralObservations)
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => model.Visit.BehavioralObservations)
                @Html.ValidationMessageFor(model => model.Visit.BehavioralObservations)
            </div>
        <p>
            <input type="submit" value="Create Visit" />
        </p>
    </fieldset>
}
4

3 に答える 3

1

モデルの状態が無効である可能性があります。これは、モデルの状態を読み取り、エラーをデバッグログにダンプする拡張メソッドです。

public static class ModelExtensions
{
    public static void DumpErrors(this System.Web.Mvc.ModelStateDictionary ModelState)
    {
        var errors = from key in ModelState
                     let errorList = ModelState[key.Key].Errors
                     where errorList.Any()
                     select new
                     {
                         Item = key.Key,
                         Value = key.Value,
                         errorList
                     };

        foreach (var errorList in errors)
        {
            System.Diagnostics.Debug.WriteLine("MODEL ERROR:");
            System.Diagnostics.Debug.WriteLine(errorList.Item);
            System.Diagnostics.Debug.WriteLine(errorList.Value);
            foreach (var error in errorList.errorList)
            {
                System.Diagnostics.Debug.WriteLine(error.ErrorMessage);
                System.Diagnostics.Debug.WriteLine(error.Exception);
            }
            System.Diagnostics.Debug.WriteLine("-----");
        }
    }
}

問題のあるアクションの最初の行でそれを呼び出し、ブレークポイントを入れて、それが何を言っているかを確認します。

ModelState.DumpErrors();
于 2012-05-16T21:56:17.340 に答える
0

1 つのプロパティを使用してマップし、1 つのプロパティを使用して使用可能なオプションを含めます... PsychometristId や Psychometrists のリストなど。次に、DropDownList の代わりに DropDownListFor を使用します。このようなことを試してください

 @Html.DropDownListFor("PsychometristId", new SelectList(Psychometrists, "name", "id"))
于 2012-05-17T20:23:16.217 に答える
0

ドロップダウン リストには何も入力されていません。あなたが持っている:

@Html.DropDownList("AppointmentTypeId", String.Empty)

したがって、選択するオプションがありません。AppointmentTypeIdあなたのプロパティVisitは常に空です。選択リストには、関連するテキストと値を持つオプションが入力されている必要があります。

意見

@{
    List<Appointment> appointmentTypes = ViewBag.AppointmentTypeOptions;
    var appointmentList = new SelectList(list, "AppointmentID", "Description");
}
@Html.DropDownListFor(x => x.AppointmentTypeId, appointmentList)

コントローラ

ViewBag.AppointmentTypeOptions = someDataStore.getAppointmentTypes();

これViewBagをより簡単にして、HTTP 投稿で Visit クラスを使用し続けることができるようにすることに注意してください。必要に応じて、これらのリストの情報を保持する ViewModel を作成できます。

于 2012-05-17T14:27:58.693 に答える