40

I have a shared view in my _Layout.cshtml for my header named "_Header.cshtml".

I would like to display text and image from the database, so I need my controller to go in the database and return it to the _Header.cshtml.

How can I do that because the controller called is always different each page the user goes. Is there a way to have controller with Shared View?

Here is the _Layout.cshtml

    <div id="header">
        <div id="title">
            @Html.Partial("_Header")
        </div>

        <div id="logindisplay">
           @Html.Partial("_CultureChooser")
            <br />
           @Html.Partial("_LogOnPartial")
        </div>

        <div id="menucontainer">
           @Html.Partial( "_MenuPartial")
        </div>
    </div>

    <div id="main">
        @RenderBody()
        <div id="footer">
        </div>
    </div>

</div>

5 Answers 5

60

In your contoller action you could specify the name of the view:

public class MenuController : Controller
{
    [ChildActionOnly]
    public ActionResult Header()
    {
        var model = ... // go to the database and fetch a model
        return View("~/Views/Shared/_Header.cshtml", model);
    }
}

Now in your _Layout.cshtml instead of @Html.Partial("_Header") do this:

@Html.Action("Header", "Menu")
Sign up to request clarification or add additional context in comments.

7 Comments

I added the _Layout.cshtml in the question. It's not on a click, it's everywhere in the website.
@Daok, what do you mean by a click? You could use the @Html.Action helper method in your layout which will call the child action on the corresponding controller. This is more powerful than a simple Html.Partial as here you have the possibility to define a separate controller/model and view for this section of the site which is repeated everywhere and which is independent from the main controller. You may checkout the following blog post about child actions: haacked.com/archive/2009/11/18/aspnetmvc2-render-action.aspx
Thank you, I still need to learn MVC :P I have this error now : Error executing child request for handler 'System.Web.Mvc.HttpHandlerUtil+ServerExecuteHttpHandlerAsyncWrapper'.
Now it works, I was returning a View() instead of a PartialView()
@DarinDimitrov I faced to this error: {Insufficient stack to continue executing the program safely. This can happen from having too many functions on the call stack or function on the stack using too much stack space}, What can I do?
|
11

... 1 year later would just like to add one thing to Dimitrov answer. You can make the controller a little cleaner:

public class MenuController : Controller
{
    [ChildActionOnly]
    public ActionResult Header()
    {
        var model = ... // go to the database and fetch a model
        return Partial("_Header", model);
    }
}

1 Comment

You saved me, Just I think it must be { return PartialView("_Header", model); } I didn't find Partial method, Am i wrong?
2

Create an action in one of your controllers to render the header view, then simply call @Html.RenderAction("Header") within the _Layout.cshtml.

You can also pass a model into the RenderAction method if required.

Comments

0

While the RenderAction approach that WDuffy provided works well, I recently blogged about this very topic using another approach using IoC:

http://crazorsharp.blogspot.com/2011/03/master-page-model-in-aspnet-mvc-3-using.html

Comments

0

I hope the question you have asked is Like.... Can we have a controller for a Shared Layout View.

Simple answer is No.

To achieve this goal you have to create a partial view for the Same purpose and put it into you shared Layout. By that means you can achieve you Goal

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.