65
votes

Is there a way to render inside my view of controller A a partial view from other controller B?

Edit: I wrote a partial view that is good for only two controllers and I don't want to copy it to their both Views folder.
I want The partial view to be displayed each time the View is rendered not after something happens.

5
This could mean several different things. Are you just wanting to reuse the view (model generated by controller A)? Are you wanting to invoke the controller action that generates the view? Are you wanting to use AJAX to load the view dynamically after the page is rendered?tvanfosson
Can you be more specific. What exactly you want to achieve?Hari Gillala
@Html.Action("YourPartialViewAction", "ControllerName", new { id = Model.id })Hari Gillala
@StewieFG I described some more want I want to achieve.gdoron is supporting Monica

5 Answers

78
votes
  1. You can share views between controllers by putting them into the Views/Shared folder. Each controller can then render that view by name.
  2. You can render a partial view (which can be shared between controllers as in (1)) within the current view using Html.Partial().
  3. You can use Html.Action() to invoke an action on a different controller and render the results within the current view.
  4. You can use AJAX to load a partial view from a different controller after the page has been rendered.
45
votes
@Html.Partial("~/Views/ControllerB/Index.cshtml")
18
votes

Yes,

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

You just need to work out the path part.

Alternatively you can put the partial view in views/shared then just return :

return PartialView("view.cshtml");
2
votes

Just a side note as i found this thread searching for the same question but the answers weren't working: in Orchard CMS modules you cannot use the neat solution posted by Pittfall, you have to use relative paths to return partial views. Lets say you have a controller

Controllers/SiteController.cs

and you want to return the partial view

Shared/MessageList/Items

then in your action methods you need to write

return PartialView("../Shared/MessageList/Items");
2
votes
@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>