EditorFor не использует EditorTemplate в MVC4

Я бился головой о стену, пытаясь заставить EditorFor работать, как описано здесь, но я не могу заставить свою версию работать.

У меня есть две ViewModels:

Интервьювиевмодель

public class InterviewViewModel
{
    ...
    public List<QuestionViewModel> Questions { get; set; }
}

и QuestionViewModel:

public class QuestionViewModel
{
    public int QuestionId { get; set; }
    public string QuestionName { get; set; }
    ...
}

Я пытался создать EditorTemplates в двух местах,

/Views/Интервью/EditorTemplates/QuestionViewModel.cshtml

и

/Views/Shared/EditorTemplates/QuestionViewModel.cshtml

Ни один, кажется, ничего не делает.

Код контроллера:

public ActionResult MyClass(int id = 0)
    {
        using (RRContext db = new RRContext())
        {
            ...

            List<QuestionModel> questionModels = new List<QuestionModel>();
            questionModels = db.QuestionModels.ToList();

            ...

            viewModel.Questions = questionViewModels;

        return View(viewModel);
        }
    }

Мой вид содержит:

@model ResidentRank.Models.Interview.InterviewViewModel

... (html.beginform is here)
Html.EditorFor(model => model.Questions);      

Код EditorTemplate:

@model ResidentRank.Models.Interview.QuestionViewModel
<div style="clear:both; margin:10px 0px;">
  <label>@Html.DisplayFor(m => m.QuestionName)</label>
  @Html.DropDownListFor(m => m.SelectedQuestionOption, Model.OptionSelector)
</div>

В голове крутится вопрос: "ПОЧЕМУ ЭТО НЕ РАБОТАЕТ?!"


person sharpslinger    schedule 12.10.2013    source источник
comment
Что вы подразумеваете под ПОЧЕМУ ЭТО НЕ РАБОТАЕТ?! Какова фактическая ошибка, которую вы получаете?   -  person Spock    schedule 13.10.2013
comment
Я не получаю сообщение об ошибке; это фактический текст в представлении, который я добавил, когда ничего не показывалось. Идея заключалась в том, что если бы у меня была какая-то другая логика на странице, из-за которой div под ней не отображался бы, то этот текст был бы.   -  person sharpslinger    schedule 13.10.2013
comment
На самом деле это работает для меня. Я опубликую свое решение в ближайшее время.   -  person Spock    schedule 13.10.2013
comment
Это должно сработать, и, как показывает Радж, у него это работает. Это означает, что у вас есть что-то в коде, который вы НЕ показываете нам, что, вероятно, мешает работе. Я предлагаю вам начать упрощать свой код до тех пор, пока вы не получите ПОЛНЫЙ образец, который вы можете опубликовать, который все еще имеет проблемы для вас (а не образец, в котором вы редактируете вещи, как вы сделали здесь). Скорее всего, при упрощении вы вдруг обнаружите, что это работает. Затем вам нужно вернуться назад и выяснить, что вы удалили.   -  person Erik Funkenbusch    schedule 13.10.2013
comment
В шаблоне редактора у вас есть QuestionViewModel, но в контроллере questionModels = db.QuestionModels.ToList(); ... viewModel.Questions = questionViewModels; это список. поэтому он не будет использовать шаблон   -  person Miller    schedule 13.10.2013
comment
На самом деле EditorFor автоматически должен использовать список, если все названо правильно.   -  person sharpslinger    schedule 13.10.2013


Ответы (1)


В домашнем контроллере

    [HttpGet]
    public ActionResult Display(int id = 0)
    {
        var questionViewModel = new InterviewViewModel {
            Questions =
                new List<QuestionViewModel>()
                {
                    //Hard coded values to represent data coming from db i.e db.QuestionModels.ToList();
                    new QuestionViewModel() {QuestionId = 1, QuestionName = "A"},
                    new QuestionViewModel() {QuestionId = 2, QuestionName = "B"}
                }
        };

        return View(questionViewModel);
    }

ViewModels

  public class InterviewViewModel {
    public List<QuestionViewModel> Questions { get; set; }
  }

  public class QuestionViewModel {
    public int QuestionId { get; set; }
    public string QuestionName { get; set; }
  }

\Видс\Хоме\Дисплей.cshtml

  @model MvcApplication1.Models.Interview.InterviewViewModel

  @using (Html.BeginForm()) 
  {
      <fieldset>
         @Html.EditorFor(x => x.Questions)
         <input type="submit" value="Save" />
      </fieldset>
  } 

\Views\Shared\EditorTemplates\QuestionViewModel.cshtml

Убедитесь, что это частичный вид.

  @model MvcApplication1.Models.Questions.QuestionViewModel
  <div style="clear:both; margin:10px 0px;">
     <label>@Html.DisplayFor(m => m.QuestionName)</label>
  </div>

Обратите внимание, что я удалил

  @Html.DropDownListFor(m => m.SelectedQuestionOption, Model.OptionSelector)

для сохранения простоты представления.

Это отображает..

введите здесь описание изображения

person Spock    schedule 12.10.2013
comment
Мне удалось заставить работать слишком упрощенную версию. Все еще работаю над тем, чтобы заставить его с фактическими данными вести себя правильно. Спасибо за вашу помощь. - person sharpslinger; 13.10.2013
comment
Проблема заключалась в том, что я объявлял Html.EditorFor без @ непосредственно внутри элемента Html.BeginForm. Я думал, что в тот момент он был в «режиме кода» с открывающей скобкой ... видимо, нет. Добавление @ и перенос его в набор полей устранило проблему. - person sharpslinger; 13.10.2013