【问题标题】:EditorFor isn't using EditorTemplate in MVC4EditorFor 没有在 MVC4 中使用 EditorTemplate
【发布时间】:2013-10-20 19:47:13
【问题描述】:

我一直在努力让 EditorFor 像 here 所述那样工作,但我这辈子都无法让我的版本正常工作。

我有两个 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);
        }
    }

我的视图包含:

@model ResidentRank.Models.Interview.InterviewViewModel

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

编辑器模板代码:

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

我脑海中的问题是“为什么这不起作用?!”

【问题讨论】:

  • “为什么这不起作用?!”是什么意思你得到的实际错误是什么?
  • 我没有收到错误;这是我在没有出现任何内容时添加的视图中的实际文本。这个想法是,如果我在页面上有一些其他逻辑导致它下面的 div 不显示,那么该文本会。
  • 实际上它对我有用。我很快就会发布我的解决方案。
  • 这应该有效,正如 Raj 所示,它对他有效。这意味着您的代码中有一些您没有向我们展示的可能会干扰事物的东西。我建议你开始简化你的代码,直到你可以得到一个完整的示例,你可以发布它仍然对你有问题(不是一个你编辑掉东西的示例,就像你在这里所做的那样)。很有可能,在简化的同时,你会发现它突然起作用了。然后你需要回溯并弄清楚你删除了什么。
  • 在编辑器模板中你有 QuestionViewModel 但在控制器中 questionModels = db.QuestionModels.ToList(); ... viewModel.Questions = questionViewModels;是一个列表。所以它不会使用模板

标签: asp.net-mvc-4 editorfor


【解决方案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);
    }

视图模型

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

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

\Views\Home\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)

为了保持视图简单。

这显示..

【讨论】:

  • 我能够得到一个过于简化的版本来工作。仍在努力获取其中包含实际数据的设备以使其正常运行。感谢您的帮助。
  • 问题是我在 Html.BeginForm 元素内立即声明 Html.EditorFor 而没有“@”。我当时认为它处于“代码模式”,带有左括号……显然不是。添加 @ 并将其包装在字段集中解决了问题。
猜你喜欢
  • 2013-06-29
  • 1970-01-01
  • 2013-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多