Utilizzare EditorTemplate è la soluzione migliore quando si visualizzano modelli che contengono un elenco di qualcosa.
Al fine di trovare l'indice per il sub-modello in fase di rendering è possibile utilizzare la proprietà che Razor imposta di default:
ViewData.TemplateInfo.HtmlFieldPrefix
dire, per esempio, sono disponibili le seguenti modelli di visualizzazione:
public class ParagraphVM
{
public int ParagraphId { get; set; }
public List<LineVM> Lines { get; set; }
}
e
public class LineVM
{
public int Id { get; set; }
public string Text {get; set;}
}
e si vuole essere in grado di modificare tutti i "LineVM" all'interno di un "ParagraphVM". Poi si sarebbe utilizzare un Editor modello modo si creerebbe una vista alla seguente cartella (se non esiste) con lo stesso nome come il sotto-modello Views/Shared/EditorTemplates/LineVM.cshtml
:
@model MyProject.Web.MVC.ViewModels.Paragraphs.LineVM
@{
//this will give you the List's element like Lines[index_number]
var field = ViewData.TemplateInfo.HtmlFieldPrefix;
}
<div id="@field">
@Html.EditorFor(l => l.Text)
</div>
Supponendo di avere un controller di ActionResult che sta tornando una visualizzazione e il superamento di un ViewModel ParagrapghVM ad una vista, ad esempio Views/Paragraph/_Paragraph.cshtml
:
@model MyProject.Web.MVC.ViewModels.Paragraphs.ParagraphVM
@using (Html.BeginForm("Details", "Paragraphs", FormMethod.Post))
{
@Html.EditorFor(p => p.Lines)
}
Questo punto di vista potrebbe rendere come molti editori per le Linee elenco come elementi contiene tale elenco. Quindi se, per esempio, i ParagraphVM.Lines elenco delle proprietà contiene 3 articoli che renderebbe qualcosa di simile:
<div id="#Lines[0]">
<input id="Lines_0__Text name="Lines[0].Text"/>
</div>
<div id="#Lines[1]">
<input id="Lines_1__Text name="Lines[1].Text"/>
</div>
<div id="#Lines[2]">
<input id="Lines_2__Text name="Lines[2].Text"/>
</div>
Con questo si può sapere esattamente quale posizione Ogni gli articoli all'interno della lista e per esempio utilizzare alcuni javascript per crea una giostra o qualunque cosa tu voglia fare con essa. Ma ricorda che per modificare quella lista non hai davvero bisogno di conoscere la posizione in cui Razor si prende cura di te per te. Se si esegue il postback del modello ParagraphVM, l'elenco Lines avrà i valori associati (se presenti) senza alcun lavoro aggiuntivo.
bene, ma come posso conoscere "i" all'interno di EditorTemplate? – Andrei
Se si utilizza '@ Html.EditorFor' in EditorTemplate non è necessario conoscere l'indice dell'elemento, Razor assegnerà un nome agli elementi in modo appropriato in modo che possano postare nuovamente in una raccolta. Se tuttavia si desidera utilizzare l'indice in un altro modo, è possibile passarlo nel ViewData. Vedi le modifiche. – Jay
Funzionerà! :) L'unica cosa che mi chiedo, che l'indice è lì. Il rasoio lo sa. Come si può uscirne? – Andrei