2009-11-07 9 views
5

Scusate se questa è una domanda di base - Sto avendo qualche problema nel rendere la transizione mentale a ASP.NET MVC dal framework di pagina.Encapsulating User Controls in ASP.NET MVC

Nel framework di pagina, utilizzo spesso i file ASCX per creare blocchi di funzionalità piccoli e incapsulati che vengono inseriti in vari punti del sito. Se sto costruendo una pagina e ho bisogno di uno di questi controlli - aggiungo solo un riferimento e tutto funziona.

Per quanto posso dire, in MVC, il file ASCX è solo un parziale vista. Questo significa che dovunque io voglia aggiungere una di queste unità di funzionalità devo anche aggiungere del codice al metodo di azione del controller per assicurarmi che il ViewData pertinente sia disponibile per l'ASCX?

Se questo è il caso, sembra un po 'un passo indietro per me. Significa, per esempio, che non posso semplicemente "rilasciare" un controllo in una pagina master senza dover aggiungere codice a tutti i controller le cui viste usano quella pagina master!

Sospetto che mi manchi qualcosa - qualsiasi aiuto sarebbe apprezzato.

Grazie, - Chris

+0

non dire scusa perché questo non è vero che tutti i lettori che leggono questo blog sono esperti in asp.net o mvc –

+0

+1 per la tua domanda grammatica stai modificando la mia domanda poi vai al mio profilo quindi modifica la mia domanda perchè Non ho una buona conoscenza in inglese –

risposta

3

Per quanto posso dire, nel MVC, il file ASCX è solo una vista parziale. Questo significa che ovunque io voglio aggiungere uno di queste unità di funzionalità ho anche devo aggiungere del codice al metodo di azione del controller per rendere che il relativo Viewdata è a disposizione del ASCX?

Sì.

Tuttavia, è possibile utilizzare un metodo di RenderAction secondo lei, invece di RenderPartial, e tutte le tue funzionalità (tra cui i dati vengono passati al sub-view) sarà incapsulato.

In altre parole, questo creerà un piccolo pacchetto che incorpora un metodo controller, visualizza dati e una vista parziale, che può essere chiamata con una riga di codice all'interno della vista principale.

+0

Eccellente - RenderAction è il pezzo del puzzle che mi mancava! Grazie molto! –

+0

Dai anche un'occhiata a questo post http://blog.codeville.net/2008/10/14/partial-requests-in-aspnet-mvc/ per alcune altre alternative. – joshperry

+0

Ecco una panoramica migliore di RenderAction: http://blogs.intesoft.net/post/2009/02/renderaction-versus-renderpartial-aspnet-mvc.aspx –

1

È possibile eseguire il rendering di una vista parziale e passare un oggetto modello a.

<% Html.RenderPartial("MyPartial", ViewData["SomeObject"]); 

Secondo lei parziale (ascx) file, è possibile quindi utilizzare l'oggetto "modello" (supponendo che hai ereditato l'oggetto proprio della tua @ decelerazione Control) per fare tutto ciò è necessario a tale oggetto .

È possibile, naturalmente, non passare e Modello e basta prendere il testo della vista parziale e posizionarlo dove lo si desidera.

Nella vista principale (file .aspx), è necessario definire l'oggetto corretto nel ViewData che si sta passando alla vista parziale.

Un altro metodo che si può fare è l'uso:

<% Html.RenderAction("MyAction", "MyController", new { Parameter1="Value1"}) %> 

Quello che il metodo precedente non fa altro che chiamare un azione di controllo, prende la sua risposta, e il luogo dove avete chiamato il metodo "() RenderAction".È l'equivalente dell'esecuzione di una richiesta contro un'azione del controllore e la lettura della risposta, tranne che si inserisce la risposta in un altro file.

Google "renderaction e renderpartial" per ulteriori informazioni.

+0

Eccellente - RenderAction è il pezzo del puzzle che mi mancava! Grazie molto! –

2

La tua domanda ha già ricevuto una risposta, ma solo per completezza, a volte c'è un'altra opzione che potresti trovare attraente.

Hai visto come i "controlli" sono mascherati su ASP.NET MVC? Sono metodi di "HtmlHelper". Se si desidera una casella di testo destinato a "Nome", per esempio, si può fare:

<%= Html.Textbox("FirstName") %> 

E avete cose del genere per molti controlli standard.

Quello che puoi fare è creare i tuoi metodi in questo modo. Per creare il proprio metodo, è necessario creare un metodo di estensione sulla classe HtmlHelper, in questo modo:

public static class HtmlHelperExtensions 
{ 
    public static string Bold(this HtmlHelper html, string text) 
    { 
     return "<b>" + text + "</b>\n"; 
    } 
} 

Quindi secondo lei, dopo aver aperto lo spazio dei nomi contiene questa definizione di classe, è possibile utilizzare in questo modo :

<%= Html.Bold("This text will be in bold-face!") %> 

Bene, questo non è particolarmente utile. Ma puoi fare cose molto interessanti. Uno che uso abbastanza spesso è un metodo che prende un'enumerazione e crea un elenco a discesa con i valori di questa enumerazione (es: enum Gender { Male, Female } e nella vista qualcosa come Gender: <%= Html.EnumDropDown(Model.Gender) %>).

Buona fortuna!