I'm using _viewstart.cshtml to automagically assign the same Razor Layout to my views.
It's a dead simple file in the root of my Views folder that looks like this:
@{
Layout = "~/Views/Shared/_Layout.cshtml";
}
This is more DRY than adding the @Layout directive to every single view.
However, this poses a problem for Razor partial views, because they run the contents of _viewstart.cshtml and therefore incorrectly assign themselves a layout, which makes them, um, no longer partial.
Here's a hypothetical project, showing the _viewstart.cshtml file, the shared _layout.shtml file, and a partial view ("AnonBar.cshtml").
https://dl.dropbox.com/u/58785/RazorPartialViewstart.PNG
Currently, the way that I'm getting around this is by adding the following line to every partial view:
@{
Layout = "";
}
This seems like the wrong way to denote a view as a partial in Razor. (Note that unlike the web forms view engine, the file extension is the same for partial views.)
Other options I considered but that are even worse:
Putting all partial views into a common folder, so they could share a common _viewstart.cshtml. This breaks the convention of views being in the same folder as their controller.
Not using partial views.
Is this something that is still being fleshed out by the Razor view engine team, or am I missing a fundamental concept?
If you return PartialView()
from your controllers (instead of return View()
), then _viewstart.cshtml
will not be executed.
Success story sharing
PartialViewResult
class. That was what I needed.PartialViewResult
instead of the usualActionResult
.ActionResult
? I'm surprised that this is an issue because the MVC runtime should not behave any differently in this case (i.e. as long as the type returned by the action method isActionResult
or any class derived from it things should just work).ActionResult
. Works fine if the return type isPartialViewResult
. Think I need to file a Connect bug?