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。我尝试用 a 更改第一个 EditorFor PartialView,但这不起作用,因为我需要模型绑定器捕获我的模型。

编辑(AJAX 方法):

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

1 回答 1

2

一种可能性是使用部分(不是编辑器模板):

<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,以便将导航上下文保留到部分中,从而为相应编辑器模板中的输入字段生成正确的名称。

您还提到question-editor在下拉选择更改时使用 AJAX 调用更新 div,但您没有显示任何 AJAX 代码来执行此操作。我猜你在某处订阅了下拉列表的 .change 事件并触发了 AJAX 调用。

于 2013-03-10T16:14:53.170 回答