2013-03-10 7 views
0

Это мой вид бритвы. Главное, когда я изменил значение выпадающего списка, обновите div question-editor. Как вы можете видеть, я вызываю EditorFor.Как обновить этот div с помощью Ajax?

@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 (PartialView)

@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 два раза с одной и той же модели. Я попытался изменить первый EditorFor с PartialView, но это не сработает, потому что мне нужно, чтобы привязка модели ловила мою модель.

EDIT (AJAX метод):

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

ответ

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 для того, чтобы p зарезервировать навигационный контекст в частичном и таким образом генерировать собственные имена для полей ввода в соответствующем шаблоне редактора.

Также вы упомянули об обновлении div question-editor с вызовом AJAX при изменении выбора выпадающего списка, но для этого вы не указали какой-либо код AJAX. Я предполагаю, что вы подписались на событие .change выпадающего сайта и вызвали вызов AJAX.

+0

Точно, я не показываю метод ajax (я предполагал, что это должно быть неуместно для этой цели). У меня не было представления о TemplateInfo, это звучит здорово !! С этим, как с помощью EditorFor право? –

+0

Да, установка 'HtmlFieldPrefix' позволяет вам управлять навигационным контекстом в шаблоне, и, таким образом, частичное может действовать как шаблон редактора. –

+0

Просто для любопытства вы упомянули, что это возможность, есть ли другие? –

Смежные вопросы