2010-08-22 6 views
2

У меня есть модель, которая содержит список QuestionEditModel, для которого я хочу использовать редактор.Define EditorTemplate для дочерней коллекции в viewmodel

Обычно я бы просто позвонил в редакцию в коллекцию, а MVC сделает все остальное. Тем не менее, мне нужен отдельный QuestionEditModel для использования разных EditorTemplates в зависимости от значения поля внутри объекта.

я бы подумал, что способ сделать это было бы что-то вроде

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

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

Так что я попробовал этот

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

, но это ничего не делают на этой странице. Странно то, что если я установил точку останова и перейду через код, это вызовет правильный EditorTemplate, будут переданы правильные данные модели и исключений нет, но это ничего не делает.

Есть ли какая-то дополнительная работа, которую мне нужно сделать в этом случае, чтобы вернуть обработанный EditorTemplate на мою страницу?

EDIT:

Полный код Edit View.

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

<% } %> 

EDIT 2:

Complete View, Controller, и код шаблона в соответствии с просьбой.

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

Edit (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); 
    } 

Edit (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

+0

Ошибка появляется на линии Html.EditorFor. – hermiod

+0

Это было просто; на конце линии, отбрасывая его. Это отлично работает, благодаря Некросу. Не могу поверить, что я был так близок! :) – hermiod