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

У меня есть две модели ViewModel:

InterviewViewModel

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/Interview/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);
        }
    }

My View содержит:

@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>

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

1
sharpslinger 13 Окт 2013 в 02:52
Что вы имеете в виду, говоря "ПОЧЕМУ ЭТО НЕ РАБОТАЕТ ?!" Какую ошибку вы получаете на самом деле?
 – 
Spock
13 Окт 2013 в 03:24
Я не получаю сообщения об ошибке; это настоящий текст в представлении, которое я добавил, когда ничего не отображалось. Идея заключалась в том, что если бы у меня была какая-то другая логика на странице, из-за которой div под ней не отображался, то этот текст был бы.
 – 
sharpslinger
13 Окт 2013 в 03:32
На самом деле у меня это работает. Я скоро опубликую свое решение.
 – 
Spock
13 Окт 2013 в 03:37
1
Это должно сработать, и, как показывает Радж, это сработает для него. Это означает, что у вас есть что-то в коде, который вы НЕ показываете нам, что может мешать чему-то. Я предлагаю вам начать упрощать свой код до тех пор, пока вы не получите ПОЛНЫЙ образец, который вы можете опубликовать, у которого все еще есть проблемы для вас (а не образец, который вы редактируете, как вы это сделали здесь). Скорее всего, упрощая, вы внезапно обнаружите, что это сработает. Затем вам нужно вернуться и выяснить, что вы удалили.
 – 
Erik Funkenbusch
13 Окт 2013 в 04:15
В шаблоне редактора у вас есть QuestionViewModel, но в контроллере questionModels = db.QuestionModels.ToList (); ... viewModel.Questions = questionViewModels; это список. так что он не будет использовать шаблон
 – 
Miller
13 Окт 2013 в 04:28

1 ответ

Лучший ответ

В HomeController

    [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; }
  }

\ Виевс \ Главная \ Display.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)

Для упрощения просмотра.

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

enter image description here

2
Spock 13 Окт 2013 в 03:44
Мне удалось заставить работать слишком упрощенную версию. Все еще работаем над тем, чтобы заставить его вести себя должным образом с реальными данными. Спасибо за вашу помощь.
 – 
sharpslinger
13 Окт 2013 в 05:25
Проблема заключалась в том, что я объявлял Html.EditorFor без символа «@» сразу внутри элемента Html.BeginForm. Я думал, что в тот момент он был в «кодовом режиме» с открывающей скобкой ... видимо, нет. Добавление @ и включение его в набор полей устранило проблему.
 – 
sharpslinger
13 Окт 2013 в 05:47