Supponiamo che io abbia ViewModel come
public class AnotherViewModel
{
public string Name { get; set; }
}
public class MyViewModel
{
public string Name { get; set; }
public AnotherViewModel Child { get; set; }
public AnotherViewModel Child2 { get; set; }
}
Nella vista posso eseguire il rendering di un parziale con
<% Html.RenderPartial("AnotherViewModelControl", Model.Child) %>
Nel parziale lo farò
<%= Html.TextBox("Name", Model.Name) %>
or
<%= Html.TextBoxFor(x => x.Name) %>
Tuttavia, il problema è che entrambi renderanno name = "Name" mentre devo avere name = "Child.Name" affinché il raccoglitore di modelli funzioni correttamente. Oppure, name = "Child2.Name" quando eseguo il rendering della seconda proprietà utilizzando la stessa vista parziale.
Come faccio a fare in modo che la mia visualizzazione parziale riconosca automaticamente il prefisso richiesto? Posso passarlo come parametro ma questo è troppo scomodo. Questo è anche peggio quando voglio, ad esempio, renderlo ricorsivamente. C'è un modo per rendere le viste parziali con un prefisso o, ancora meglio, con la riconizione automatica dell'espressione lambda chiamante in modo che
<% Html.RenderPartial("AnotherViewModelControl", Model.Child) %>
aggiungerà automaticamente "Child" corretto. prefisso alle stringhe nome / ID generate?
Posso accettare qualsiasi soluzione, inclusi i motori di visualizzazione e le librerie di terze parti: in realtà uso Spark View Engine ("risolvo" il problema utilizzando le sue macro) e MvcContrib, ma non ho trovato una soluzione lì. XForms, InputBuilder, MVC v2: qualsiasi strumento / insight che fornisce questa funzionalità sarà eccezionale.
Attualmente penso di codificarlo da solo, ma sembra una perdita di tempo, non posso credere che questa roba banale non sia già implementata.
Possono esistere molte soluzioni manuali e tutte sono benvenute. Ad esempio, posso forzare i miei partials a essere basati su IPartialViewModel <T> {public string Prefix; Modello T; }. Ma preferisco una soluzione esistente / approvata.
AGGIORNAMENTO: c'è una domanda simile senza risposta qui .
helper.ViewData.TemplateInfo.HtmlFieldPrefix
sotto forma di{oldprefix}.{newprefix}