2010-08-22 29 views
2

我有一个模型,其中包含我想使用EditorFor的QuestionEditModel的列表。在viewmodel中定义子集合的EditorTemplate

通常情况下,我只需在集合上调用EditorFor,MVC将完成剩下的工作。但是,我需要单独的QuestionEditModel根据对象内某个字段的值使用不同的EditorTemplates。

我会一直认为,这样做的方法是像

<%: Html.EditorFor(model=>model.Questions), [fieldname from individual question] %> 

,但我无法弄清楚如何告诉它看看现在选择的问题,并从使用EntryType场该问题来确定使用哪个EditorTemplate。

所以,我想这个

  <% foreach (Reviewer.Models.QuestionEditModel qem in Model.Questions) 
      { 
       Html.EditorFor(q=>qem, qem.EntryType, null); 
      } %> 

但这并不到页面呈现任何内容。奇怪的是,如果我设置了一个断点并运行了代码,这确实会调用正确的EditorTemplate,正确的模型数据被传入并且没有例外,但它不会呈现任何内容。

在这种情况下,我需要做一些额外的工作来将渲染的EditorTemplate重新放回到我的页面吗?

编辑:编辑视图的

的完整代码。

<% using (Html.BeginForm()) {%> 
    <%: Html.ValidationSummary(true) %> 

    <%: Html.HiddenFor(model=>model.AcadPeriod) %> 
    <%: Html.HiddenFor(model=>model.ReviewID) %> 
    <%: Html.HiddenFor(model=>model.ReviewName) %> 
    <%: Html.HiddenFor(model=>model.CategoryID) %> 
    <%: Html.HiddenFor(model=>model.CategoryName) %> 
    <%-- Categories not getting returned in model for some reason. Use EditorFor or DisplayFor instead of loop? --%> 
    <%: Html.HiddenFor(model=>model.Categories) %> 
    <%: Html.HiddenFor(model=>model.ClassificationID) %> 
    <%: Html.HiddenFor(model=>model.ClassificationName) %> 

    <div style="width:100%"> 

    <div style="float:left"> 
     <ul style="list-style-type:none"> 
      <% for (int i = 0; i < Model.Categories.Count(); i++) 
       { %> 
      <li style="background-color:Gray; border: 1px solid black; padding: 3px 3px 3px 3px; margin-bottom: 2px"> 
      <%: Html.ActionLink(Model.Categories[i].name, "Edit", new { AcadPeriod = Model.AcadPeriod, ClassificationID=Model.ClassificationID, ReviewID=Model.ReviewID, CategoryID=Model.Categories[i].category_id })%> 
      </li> 
      <% }%> 
     </ul> 
    </div> 

    </div> 
       <% foreach (Reviewer.Models.QuestionEditModel qem in Model.Questions) { %> 
        <%: Html.EditorFor(q=>qem, qem.EntryType,null); %> 
       <% } %> 

     <p> 
      <input type="submit" value="Save" /> 
     </p> 

<% } %> 

编辑2:

完整视图,控制器和模板代码的要求。

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<Reviewer.Models.ReviewEditModel>" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server"> 
Edit 
</asp:Content> 

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 

<h1><%: Model.AcadPeriod %> &gt; <%: Model.ClassificationName %> &gt; <%: Model.ReviewName %></h1> 

<% using (Html.BeginForm()) {%> 
    <%: Html.ValidationSummary(true) %> 

    <%: Html.HiddenFor(model=>model.AcadPeriod) %> 
    <%: Html.HiddenFor(model=>model.ReviewID) %> 
    <%: Html.HiddenFor(model=>model.ReviewName) %> 
    <%: Html.HiddenFor(model=>model.CategoryID) %> 
    <%: Html.HiddenFor(model=>model.CategoryName) %> 
    <%-- Categories not getting returned in model for some reason. Use EditorFor or DisplayFor instead of loop? --%> 
    <%: Html.HiddenFor(model=>model.Categories) %> 
    <%: Html.HiddenFor(model=>model.Questions) %> 
    <%: Html.HiddenFor(model=>model.ClassificationID) %> 
    <%: Html.HiddenFor(model=>model.ClassificationName) %> 

    <div style="width:100%"> 

    <div style="float:left;width: 15%"> 
     <ul style="list-style-type:none"> 
      <% for (int i = 0; i < Model.Categories.Count(); i++) 
       { %> 
      <li style="background-color:Gray; border: 1px solid black; padding: 3px 3px 3px 3px; margin-bottom: 2px"> 
      <%: Html.ActionLink(Model.Categories[i].name, "Edit", new { AcadPeriod = Model.AcadPeriod, ClassificationID=Model.ClassificationID, ReviewID=Model.ReviewID, CategoryID=Model.Categories[i].category_id })%> 
      </li> 
      <% }%> 
     </ul> 
    </div> 

    <div style="float:left; width: 80%; margin-left: 5px"> 

<% foreach (Reviewer.Models.QuestionEditModel qem in Model.Questions) { %> 
<%: Html.EditorFor(q=>qem, qem.EntryType,null) %> 
<% } %> 

    </div> 
    </div> 
    <div style="clear:both" /> 
     <p> 
      <input type="submit" value="Save" /> 
     </p> 

<% } %> 

<div> 
    <%: Html.ActionLink("Back to List", "Index") %> 
</div> 

</asp:Content> 

编辑模板:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Reviewer.Models.QuestionEditModel>" %> 

<div style="width:100%; border: 1px solid black"> 
<div style="width: 100%; border: 1px solid black"><h2><%: Model.QuestionName %></h2></div> 
<div style="width:25%; display:inline; border: 1px solid black; float:left"> 
    <%: Model.QuestionText %> 
</div> 
<div style="width:70%; border: 1px solid black; float:left"> 
    <%: Html.TextAreaFor(model=>model.Answer) %> 
    <%:Html.ValidationMessageFor(model=>model.Answer) %> 
</div> 

<div style="clear:both" /> 
</div> 

    <fieldset> 
     <legend>TEXT</legend> 

     <div class="editor-label"> 
      <%: Html.LabelFor(model => model.QuestionID) %> 
     </div> 
     <div class="editor-field"> 
      <%: Html.TextBoxFor(model => model.QuestionID) %> 
      <%: Html.ValidationMessageFor(model => model.QuestionID) %> 
     </div> 

     <div class="editor-label"> 
      <%: Html.LabelFor(model => model.QuestionName) %> 
     </div> 
     <div class="editor-field"> 
      <%: Html.TextBoxFor(model => model.QuestionName) %> 
      <%: Html.ValidationMessageFor(model => model.QuestionName) %> 
     </div> 

     <div class="editor-label"> 
      <%: Html.LabelFor(model => model.QuestionText) %> 
     </div> 
     <div class="editor-field"> 
      <%: Html.TextBoxFor(model => model.QuestionText) %> 
      <%: Html.ValidationMessageFor(model => model.QuestionText) %> 
     </div> 

     <div class="editor-label"> 
      <%: Html.LabelFor(model => model.DefaultText) %> 
     </div> 
     <div class="editor-field"> 
      <%: Html.TextBoxFor(model => model.DefaultText) %> 
      <%: Html.ValidationMessageFor(model => model.DefaultText) %> 
     </div> 

     <div class="editor-label"> 
      <%: Html.LabelFor(model => model.EntryType) %> 
     </div> 
     <div class="editor-field"> 
      <%: Html.TextBoxFor(model => model.EntryType) %> 
      <%: Html.ValidationMessageFor(model => model.EntryType) %> 
     </div> 

     <div class="editor-label"> 
      <%: Html.LabelFor(model => model.HelpText) %> 
     </div> 
     <div class="editor-field"> 
      <%: Html.TextBoxFor(model => model.HelpText) %> 
      <%: Html.ValidationMessageFor(model => model.HelpText) %> 
     </div> 

     <div class="editor-label"> 
      <%: Html.LabelFor(model => model.Answer) %> 
     </div> 
     <div class="editor-field"> 
      <%: Html.TextBoxFor(model => model.Answer) %> 
      <%: Html.ValidationMessageFor(model => model.Answer) %> 
     </div> 

     <div class="editor-label"> 
      <%: Html.LabelFor(model => model.OptionValue) %> 
     </div> 
     <div class="editor-field"> 
      <%: Html.TextBoxFor(model => model.OptionValue) %> 
      <%: Html.ValidationMessageFor(model => model.OptionValue) %> 
     </div> 

     <div class="editor-label"> 
      <%: Html.LabelFor(model => model.completedBy) %> 
     </div> 
     <div class="editor-field"> 
      <%: Html.TextBoxFor(model => model.completedBy) %> 
      <%: Html.ValidationMessageFor(model => model.completedBy) %> 
     </div> 

     Option Required: <%:Html.TextBoxFor(model=>model.OptionRequired) %> 
     Answer Required: <%: Html.TextBoxFor(model=>Model.AnswerRequired) %> 

    </fieldset> 

编辑(GET)操作:

 public ActionResult Edit(string AcadPeriod, string ClassificationID, string ReviewID, int CategoryID) 
    { 
     Reviewer.Models.ReviewEditModel dset1 = rr.GetReviewEditModel(AcadPeriod, ReviewID, CategoryID.ToString(), ClassificationID); 
     return View(dset1); 
    } 

编辑(POST)行动:

 [HttpPost] 
    public ActionResult Edit(Reviewer.Models.ReviewEditModel model) 
    { 
     try 
     { 
      foreach (Reviewer.Models.QuestionEditModel qem in model.Questions) 
      { 
       if (qem.Answer == null || qem.OptionValue == null) { qem.completedBy = this.HttpContext.User.Identity.Name; } 
      } 

      if (ModelState.IsValid) 
      { 
       rr.SaveReviewEditModel(model); 

       return RedirectToAction("Index"); 
      } 
      else { return View(model); } 
      } 
     catch 
     { 
      return View(model); 
     } 
    } 

回答

1

你必须告诉它实际呈现(<%: %>)什么:

<% foreach (Reviewer.Models.QuestionEditModel qem in Model.Questions) { %> 
    <%: Html.EditorFor(q=>qem, qem.EntryType, null) %> 
<% } %> 
+0

真是个傻瓜,我以为我会很聪明,并试图把它们都放在一个代码块,完全忘记了: 。但是,当运行你的代码时,我得到了一个CS1026:),但是我看不到任何缺少的偏差。 我已将完整的“编辑视图”代码添加到原始文章中。 – hermiod 2010-08-22 22:13:33

+0

错误出现在Html.EditorFor行上。 – hermiod 2010-08-22 22:20:09

+0

这只是;在线的末尾扔掉它。 完美地完成了这项工作,谢谢Necros。不敢相信我离得太近了! :) – hermiod 2010-08-22 22:21:38