2009-05-18 24 views
207

È possibile visualizzare una vista da un altro controller?Visualizzare una vista da un altro controller in ASP.NET MVC

Ad esempio, ho una vista CategoriesController e una Category/NotFound.aspx. Mentre nello CategoriesController, posso facilmente restituire View("NotFound").

Ora dire che ho un ProductsController e un'azione e vista per aggiungere un prodotto. Tuttavia, questa azione richiede che abbiamo una categoria per aggiungere il prodotto a. Ad esempio, Products/Add/?catid=10.

Se non sono in grado di trovare la categoria in base a catid, voglio mostrare la NotFound vista dal controller Categorie invece di creare una vista CategoryNotFound sotto il controller prodotti.

È possibile o sto strutturando le cose nel modo sbagliato? C'è un buon modo per farlo?

risposta

229

Sì. Per impostazione predefinita, ASP.NET MVC controlla per primo in \Views\[Controller_Dir]\, ma in seguito, se non trova la vista, controlla \Views\Shared.

La directory condivisa è specificamente destinata alla condivisione di viste su più controller. Basta aggiungere la tua vista alla sottodirectory condivisa e sei a posto.

Se si esegue return View("~/Views/Wherever/SomeDir/MyView.aspx") È possibile restituire qualsiasi visualizzazione desiderata.

+0

Grazie, sembra la soluzione che dovrei usare. Mi chiedo ancora se è possibile visualizzare una vista da un altro controller. Immagino che questo violi alcune regole in MVC? – dtc

+1

Nella situazione descritta sopra, sì, dovresti usare la cartella condivisa. –

+65

Sì, anche questo è possibile. Se si esegue visualizzazione di ritorno ("~/Visualizzazioni/Ovunque/SomeDir/MyView.aspx") È possibile restituire qualsiasi visualizzazione desiderata. Ciò non viola nessuna regola particolare in quanto tale, tuttavia, ASP.Net MVC è interamente basato sulla "convenzione sulla congfigurazione". In altre parole, il framework è progettato per funzionare automaticamente usando alcune convenzioni e dovresti utilizzarlo dove possibile. – womp

5

È inoltre possibile chiamare qualsiasi controller da JavaScript/jQuery. Supponiamo che tu abbia un controller che restituisce 404 o un altro usercontrol/pagina. Quindi, su qualche azione, dal tuo codice cliente, puoi chiamare un indirizzo che spari il tuo controller e restituire il risultato nel formato HTML il tuo codice cliente può prendere questo risultato restituito e metterlo ovunque tu voglia nella tua pagina ...

+0

Non l'ho fatto sapere che. Sembra che sia qualcosa che potrei usare in futuro. Sì, rocce in mvc :) – dtc

146

È possibile utilizzare:

return View("../Category/NotFound", model); 

E 'stato testato in ASP.NET MVC 3, ma dovrebbe funzionare anche in ASP.NET MVC 2.

+3

Funziona in MVC 2 e si è rivelata la soluzione più pulita per una situazione insolita con cui ho a che fare. –

+3

funziona anche in mvc1 –

+3

Il resharper segnalerà tale collegamento come un errore ma funziona ancora. – CodeMonkeyKing

31

Hai provato RedirectToAction?

+1

Direi che questo è l'MVC per chiunque non desideri visualizzare le cartelle condivise, notare che per tutte le altre soluzioni (come l'utilizzo di percorsi diretti) chiunque provi a ri-factor le viste non dovranno tenere a mente che è anche utilizzato in un altro controller, con conseguente comportamento imprevedibile –

+3

come su senza reindirizzamento? – Luckyy

+0

soluzione migliore di quella di spostare la vista in cartelle condivise – juFo

27

Sì, è possibile. Restituisce un metodo RedirectToAction() come questo:

return RedirectToAction("ActionOrViewName", "ControllerName"); 
+1

Credo che questo dovrebbe andare come RedirectToAction ("ActionOrView", "Controller", null) in quanto altrimenti il ​​secondo parametro è routeValues ​​ –

13

Sì, è possibile. Restituisce un azione simile a questo:

return RedirectToAction("View", "Name of Controller"); 

Un esempio:

RedirectToAction("Details/" + id.ToString(), "FullTimeEmployees"); 

Questo approccio chiamerà il metodo GET

Inoltre potreste passare i valori per azione in questo modo:

RedirectToAction("Details/" + id.ToString(), "FullTimeEmployees", new {id = id.ToString(), viewtype = "extended"); 
+0

come potrei inviare un oggetto con questo approccio? – Djeroen

+0

Dai un'occhiata @Djeroen –

+2

Non stai restituendo una vista, stai chiamando un'azione. – 0014

Problemi correlati