0

これが私のかみそりの見方です。主なポイントは、ドロップダウン値が変更され、question-editordiv が更新されたときです。ご覧のとおり、 を呼び出していEditorForます。

@model Contoso.MvcApplication.Models.Question.CreateQuestionViewModel

@{
    ViewBag.Title = "Create Open Question";
}

<h3>Create Question</h3>

<select id="question-type-dropdown" style="margin-bottom: 20px;">
    <option value="MC">Multiple Choice</option>
    <option value="O">Open Question</option>
</select>

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

    <fieldset>
        @Html.HiddenFor(model => model.QuestionSetId)
        <legend>Question Template</legend>

        <div id="question-editor">
            @Html.EditorFor(model => model.Template, "_QuestionEditorBoxPartial")
        </div>

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

これは部分的なビューです。使用するビュー テンプレートを選択するための EditorModelFor が含まれているだけです。

_QuestionEditorBox (部分表示)

@model Contoso.Core.Base.QuestionTemplate
@Html.EditorForModel(Contoso.Core.QuestionRepositoryManager.GetQuestionTemplateView(Model))
public abstract class Question
{
   public int Id {get;set;}
   public string QuestionText { get; set; }
}

public OpenQuestion : Question { ... }
public MultipleChoiceQuestion : Question { ... }

public class CreateQuestionViewModel
{
    public int QuestionSetId { get; set; }
    public QuestionTemplate Template { get; set; }
}

しかし、これを実行すると、同じモデルで EditorFor を 2 回実行しているため、何も表示されません。最初の EditorFor を で変更しようとしましたPartialViewが、モデル バインダーがモデルをキャッチする必要があるため、これは機能しません。

編集(AJAXメソッド):

$("#question-type-dropdown").change(function () {
    $.get("/Question/UpdateQuestionEditorBox", { questionType: $(this).val() },
        function (data) {
            $("#question-editor").html(data);
        });
});
4

1 に答える 1

2

1 つの可能性は、パーシャル (エディタ テンプレートではない) を使用することです。

<div id="question-editor">
    @Html.Partial("_QuestionEditorBox.cshtml", Model.Template)
</div>

そして、あなたのパーシャルの中で:

@model Contoso.Core.Base.QuestionTemplate
@{
    ViewData.TemplateInfo.HtmlFieldPrefix = "Template";
}
@Html.EditorForModel(Contoso.Core.QuestionRepositoryManager.GetQuestionTemplateView(Model))

HtmlFieldPrefixナビゲーション コンテキストをパーシャルに保存し、対応するエディター テンプレートの入力フィールドに適切な名前を生成するために、どのように を設定したかに注目してください。

また、ドロップダウンの選択が変更されたときにAJAX呼び出しでdivを更新すると述べquestion-editorましたが、それを行うためのAJAXコードは示していません。どこかでドロップダウンの .change イベントを購読し、AJAX 呼び出しをトリガーしたと思います。

于 2013-03-10T16:14:53.170 に答える