Domanda

Ho un modello che contiene un elenco di QuestionEditModel per il quale voglio usare un EditorFor.

Normalmente, vorrei solo richiamare EditorFor sulla raccolta e l'MVC farà il resto. Tuttavia, ho bisogno del QuestionEditModel individuo di usare EditorTemplates diverse a seconda del valore di un campo all'interno dell'oggetto.

avrei pensato che il metodo per fare questo sarebbe qualcosa di simile

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

ma non riesco a capire come dirgli di esaminare la questione, che è attualmente selezionato e utilizzare il campo EntryType dalla questione per determinare quale EditorTemplate all'uso.

Così ho provato questo

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

, ma questo non rende nulla sulla pagina. La cosa strana è che se ho impostato un punto di interruzione ed eseguire il codice, questo non chiamare l'EditorTemplate corretta, i dati di modello corretto viene passato e non ci sono eccezioni, ma semplicemente non rende nulla.

C'è qualche lavoro in più ho bisogno di fare in questo scenario per ottenere la parte posteriore EditorTemplate reso in alla mia pagina?

Modifica

codice completo della Modifica visualizzazione.

<% 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 codice View, Controller, e il modello come richiesto.

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

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

Modifica (GET) Azione:

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

Modifica (POST) Azione:

        [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);
        }
    }
È stato utile?

Soluzione

Devi dire che cosa realmente rendere (<%: %>):

<% foreach (Reviewer.Models.QuestionEditModel qem in Model.Questions) { %>
     <%: Html.EditorFor(q=>qem, qem.EntryType, null) %>
<% } %>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top