62

I am new to asp.net MVC so please bear with me. I need build a menu that repeats across multiple views. What would better serve the purpose Html.Action OR Html.Partial.

rene
  • 37,946
  • 78
  • 99
  • 132
developer747
  • 13,032
  • 22
  • 78
  • 136
  • 3
    Without more info Html.Partial. Put you're menu content in a partial view and call it with `@Html.Partial("partialViewName")` – MisterIsaak Aug 01 '12 at 19:59
  • An Action does a whole lot more (potentially) than just return a view. Suppose you want to count (Log) every time the menu is built (or log who requested the menu, or what kind of menu he requested). The bottom line would be the same - the static menu div in html. But the result would not. – LongChalk Aug 13 '18 at 08:20

2 Answers2

121

Here are what I consider my guidelines on using Html.Action or Html.Partial

Html.Partial

  1. Use Html.Partial when you are rendering static content or,
  2. If you are going to pass data from the ViewModel that is being sent to the main view

Html.Action

  1. Use Html.Action when you actually need to retrieve additional data from the server to populate the partial view

Basically, if is static, use Html.Partial(). If dynamic, model independent data, use Html.Action(). There are probably more scenarios, but this will give you a good idea of where/how to go. Html.RenderPartial() and Html.RenderAction() are interchangeable for the similarly named functions above.

Tommy
  • 38,021
  • 8
  • 85
  • 116
  • Good Explanation +1 for you. – Pamma Nov 05 '13 at 19:45
  • Beware that if the app has multiple cycles through controllers it can make it slightly more difficult to reason what happens for a given action, as Html.Action() returns to a – potentially different – controller. Depending on your implementations/dependencies, this can be expensive, too, and [filters](http://msdn.microsoft.com/en-us/library/gg416513(vs.98).aspx) can be an alternative in some cases. – Cornelius Aug 21 '14 at 16:44
  • 1
    +1 for the ideas of actions being for dynamic for one simple reason (for me): the content rendering by way of a controller means that it can rendered independently of the containing view. This means that the view can render, and then if you want the page to refresh it, you can make an ajax call to the same (partial) controller action, and use the result to refresh the container. – C.List Jan 05 '16 at 01:42
67

Html.Partial: Render a Partial View without hitting a controller action first. See: Partial Views

Html.Action Call a Controller Action, which may return a view/partial view (or may not, it could throw an HttpNotFound or return Json, or other things).

Does your menu require a view model, or is it static?

If it's a static menu, Html.Partial will fit your needs. Place the static menu content inside the partial view and call Html.Partial where you want it to render.

If the menu is being generated off a view model, you can use either Html.Partial or Html.Action:

Chaining the view model using Html.Partial:

public class MenuViewModel {
    // menu data goes here
}

public class GeneralViewModel : MenuViewModel {
    // general view info goes here
}

public ActionResult Index() {
    return View(new GeneralViewModel());
}

// View Code
@model GeneralViewModel
<div>@Html.Partial("_partialName", model)</div>

Here we pass a complete view model to the view and the view calls Partial and hands its model off to the partial view.

** Separating the model using Html.Action:**

public ActionResult Index() {
    return View(new GeneralViewModel());
}

public ActionResult MenuView() {
    return PartialView(new MenuViewModel());
}

// View Code
@model GeneralViewModel
<div>@Html.Action("MenuView")</div>

Here the view calls the controller action MenuView which creates a new view model and passes it to the partial.

Jesse Hallam
  • 6,394
  • 8
  • 44
  • 67