Question

J'ai un modèle qui contient une liste de QuestionEditModel pour laquelle je veux utiliser un EditorFor.

Normalement, je voudrais simplement appeler EditorFor sur la collecte et MVC fera le reste. Cependant, je dois le QuestionEditModel individu à utiliser différentes 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 utilisez le champ EntryType de la question pour déterminer qui EditorTemplate à utiliser.

Alors j'ai 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 mets un point d'arrêt et courir sur le code, cela ne remet la EditorTemplate correcte, les données de modèle correct est passé et il n'y a pas d'exceptions, mais ça ne rend rien.

Y at-il un travail supplémentaire que je dois faire dans ce scénario pour obtenir le dos EditorTemplate rendu pour 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:

Affichage complet, le contrôleur et le code modèle comme l'a 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>

Editeur de 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);
        }
    }
Était-ce utile?

La solution

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

<% foreach (Reviewer.Models.QuestionEditModel qem in Model.Questions) { %>
     <%: Html.EditorFor(q=>qem, qem.EntryType, null) %>
<% } %>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top