ForEach con EditorFor
-
04-10-2019 - |
Domanda
Io ho un modello Entità che contiene una collezione di oggetti di messaggio che sono del tipo di messaggio, che ha diverse proprietà, compresi i contenuti, MessageID, da e per.
Ho creato un EditorTemplate per il tipo di messaggio, però, non posso farlo per visualizzare il contenuto della raccolta dei messaggi.
Non ci sono errori, ma nulla è uscita.
Si noti che il codice di vista è da un EditorTemplate per il genitore di classe Talkback. Si può avere un EditorTemplate chiamare un altro EditorTemplate per una collezione bambino?
Sia il Talkback e la classe del messaggio sono generati da Entity Framework da un database esistente.
Visualizza codice:
<% foreach (TalkbackEntityTest.Message msg in Model.Messages)
{
Html.EditorFor(x=> msg, "Message");
} %>
Questo è il mio codice del template. E 'il codice della vista generato automaticamente di serie con alcune lievi modifiche.
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<TalkbackEntityTest.Message>" %>
<%: Html.ValidationSummary(true) %>
<fieldset>
<legend>Fields</legend>
<div class="editor-label">
<%: Html.LabelFor(model => model.MessageID) %>
</div>
<div class="editor-field">
<%: Html.TextBoxFor(model => model.MessageID) %>
<%: Html.ValidationMessageFor(model => model.MessageID) %>
</div>
<div class="editor-label">
<%: Html.LabelFor(model => model.acad_period) %>
</div>
<div class="editor-field">
<%: Html.TextBoxFor(model => model.acad_period) %>
<%: Html.ValidationMessageFor(model => model.acad_period) %>
</div>
<div class="editor-label">
<%: Html.LabelFor(model => model.talkback_id) %>
</div>
<div class="editor-field">
<%: Html.TextBoxFor(model => model.talkback_id) %>
<%: Html.ValidationMessageFor(model => model.talkback_id) %>
</div>
<div class="editor-label">
<%: Html.LabelFor(model => model.From) %>
</div>
<div class="editor-field">
<%: Html.TextBoxFor(model => model.From) %>
<%: Html.ValidationMessageFor(model => model.From) %>
</div>
<div class="editor-label">
<%: Html.LabelFor(model => model.To) %>
</div>
<div class="editor-field">
<%: Html.TextBoxFor(model => model.To) %>
<%: Html.ValidationMessageFor(model => model.To) %>
</div>
<div class="editor-label">
<%: Html.LabelFor(model => model.SentDatetime) %>
</div>
<div class="editor-field">
<%: Html.TextBoxFor(model => model.SentDatetime, String.Format("{0:g}", Model.SentDatetime)) %>
<%: Html.ValidationMessageFor(model => model.SentDatetime) %>
</div>
<div class="editor-label">
<%: Html.LabelFor(model => model.content) %>
</div>
<div class="editor-field">
<%: Html.TextBoxFor(model => model.content) %>
<%: Html.ValidationMessageFor(model => model.content) %>
</div>
<div class="editor-label">
<%: Html.LabelFor(model => model.MessageTypeID) %>
</div>
<div class="editor-field">
<%: Html.TextBoxFor(model => model.MessageTypeID) %>
<%: Html.ValidationMessageFor(model => model.MessageTypeID) %>
</div>
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
C'è sicuramente contenuto nella raccolta messaggio come, se tolgo EditorFor e mettere in Response.Write sulla proprietà contenuti della classe Messaggio, ottengo il campo dei contenuti per 3 Messaggio oggetti sulla pagina, che è esattamente come ci si aspetta .
Soluzione
Non c'è bisogno di foreach
manualmente. Basta mettere un file chiamato Message.ascx
contenente l'editor di modelli hai mostrato all'interno della cartella ~/Shared/EditorTemplates/
e nella vista solo includerlo:
<%: Html.EditorFor(model => model.Messages) %>