2010-08-22 4 views
2

J'ai un modèle qui contient une liste de QuestionEditModel pour lequel je veux utiliser un EditorFor.Définir EditorTemplate pour la collection enfant dans viewmodel

Normalement, j'appellerais simplement EditorFor sur la collection et MVC fera le reste. Cependant, j'ai besoin de l'individu QuestionEditModel pour utiliser différents EditorTemplates en fonction de la valeur d'un champ dans l'objet.

J'ai pensé que la méthode pour faire cela serait quelque chose comme

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

, mais je ne peux pas comprendre comment dire à examiner la question qui est actuellement sélectionné et utiliser le champ EntryType de la question pour déterminer quel EditorTemplate utiliser.

J'ai donc essayé cette

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

, mais cela ne rend rien à la page. La chose étrange est que si je place un point d'arrêt et exécute le code, ceci appelle le EditorTemplate correct, les données de modèle correctes sont passées et il n'y a aucune exception, mais cela ne rend rien.

Y a-t-il un travail supplémentaire que je dois faire dans ce scénario pour que le rendu EditorTemplate soit restauré sur ma page?

EDIT:

code complet de la vue Edition.

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

Fiche complète, contrôleur, et le code de modèle tel que demandé.

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

Editor Modèle:

<%@ 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) Action:

 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) Action:

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

Répondre

1

Vous devez dire quoi rendre réellement (<%: %>):

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

Quel imbécile, je pensais que je serais intelligent et d'essayer de mettre tout cela dans un bloc de code et complètement oublié le: . Cependant, lors de l'exécution de votre code, je reçois un CS1026:) attendu, mais je ne vois pas de parenthèses manquantes. J'ai ajouté le code d'édition complet à mon message d'origine. – hermiod

+0

L'erreur apparaît sur la ligne Html.EditorFor. – hermiod

+0

C'était juste le; à la fin de la ligne le jetant. Cela a parfaitement fonctionné, merci Necros. Je ne peux pas croire que j'étais si proche! :) – hermiod

Questions connexes