2011-11-01 12 views
61

C'è un modo per eseguire il rendering della vista del controller A una vista parziale dall'altro controller B?Render Vista parziale dall'altro controller

Modifica: ho scritto una vista parziale che è valida solo per due controller e non voglio copiarla nella loro cartella Views.
Desidero La vista parziale da visualizzare ogni volta che la vista viene sottoposta a rendering non dopo che qualcosa accade.

+1

Questo potrebbe significare diverse cose. Vuoi solo riutilizzare la vista (modello generato dal controller A)? Vuoi invocare l'azione del controller che genera la vista? Vuoi usare AJAX per caricare la vista dinamicamente dopo il rendering della pagina? – tvanfosson

+0

Puoi essere più specifico. Che cosa esattamente vuoi ottenere? –

+1

@ Html.Action ("YourPartialViewAction", "ControllerName", new {id = Model.id}) –

risposta

75
  1. è possibile condividere opinioni tra i controller mettendoli nella cartella Visualizzazioni/Shared. Ogni controller può quindi renderizzare quella vista per nome.
  2. È possibile eseguire il rendering di una vista parziale (che può essere condivisa tra i controller come in (1)) all'interno della vista corrente utilizzando Html.Partial().
  3. È possibile utilizzare Html.Action() per richiamare un'azione su un altro controller e visualizzare i risultati nella vista corrente.
  4. È possibile utilizzare AJAX per caricare una vista parziale da un controller diverso dopo il rendering della pagina.
+0

Informazioni sull'opzione 3: Posso richiamare il mio controller e visualizzare una vista parziale dall'altro controller? senza usare il percorso relativo Grazie! – gdoron

+0

@gdoron è possibile localizzare il codice che genera la vista parziale in uno o l'altro controller e includerlo tramite 'Html.Action()' per le viste in entrambi i controller. – tvanfosson

+5

5. È inoltre possibile eseguire il rendering di una vista come vista parziale fornendo il percorso completo come @ Html.Partial ("~/Views/Partials/Location.cshtml", Modello) –

17

Sì,

return PartialView("/path/view.cshtml"); 

Hai solo bisogno di lavorare la parte percorso.

In alternativa si può mettere la vista parziale in vista/shared poi basta tornare:

return PartialView("view.cshtml"); 
+1

Non voglio che la partialview sia condivisa. E il percorso relativo non è del tutto appropriato per il sistema di routing mvc. Altri suggerimenti? – gdoron

+0

Solo un piccolo dubbio qui. Il metodo PartialView restituisce la stringa codificata HTML o l'html raw? – Karan

1
@model YourModelNamesapce.ModelName 
@{ 
    ViewBag.Title = "Edit"; 
    Layout = "~/Views/Shared/_LayoutForPartialViews.cshtml"; 
} 
<table> 
    <tr> 
     <td> 
      @Html.LabelFor(model => model.fieldname) 
     </td> 
     <td> 
      @Html.DisplayFor(model => model.fieldname) 
     </td> 
    </tr> 
    <tr> 
     <td>@Html.Action("PartialViewAction", "Controller", new { id = Model.id })</td> 
    </tr> 
</table> 
+0

Scusa ma come sta rispondendo alla mia domanda ?! – gdoron

+0

gordon, ho aggiornato la mia risposta –

+1

Questa non è una risposta molto chiara, tuttavia Hari sottolinea che DisplayFor è una buona opzione. – mcfea

44
@Html.Partial("~/Views/ControllerB/Index.cshtml") 
+3

La soluzione più semplice. : D – wooncherk

+0

È possibile chiamare direttamente l'azione sul controller anziché sulla vista? – FrenkyB

1

Solo una nota a margine, come ho trovato questa discussione cercando la stessa domanda, ma le risposte non sono state lavorando: nei moduli Orchard CMS non è possibile utilizzare la neat solution pubblicato da Pittfall, è necessario utilizzare percorsi relativi per restituire viste parziali. Diciamo che dispone di un controller

Controllers/SiteController.cs 

e si desidera restituire la vista parziale

Shared/MessageList/Items 

poi nei tuoi metodi d'azione è necessario scrivere

return PartialView("../Shared/MessageList/Items"); 
Problemi correlati