布局页面MVC中局部视图的控制器

Ric*_*mes 0 model-view-controller asp.net-mvc razor

我需要根据选定的值在我的布局页面中动态设置横幅图像。我一直在研究,但似乎我无法为布局页面设置控制器,所以我一直在考虑使用局部视图,但显然我遗漏了一些东西。我怎样才能做到这一点?

布局页面

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>@ViewBag.Title - My ASP.NET Application</title>
    @Styles.Render("~/Content/css")
    @Scripts.Render("~/bundles/modernizr")
</head>
<body>
    <div class="header">
        <div>
            @Html.Partial("_Header")
        </div>
    </div>
    <div class="container body-content">
        @RenderBody()
        <hr />
        <footer>
            <p>&copy; @DateTime.Now.Year - My ASP.NET Application</p>
        </footer>
    </div>

    @Scripts.Render("~/bundles/jquery")
    @Scripts.Render("~/bundles/bootstrap")
    @RenderSection("scripts", required: false)
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

局部视图

@model TicketPaymentsAzureMVC.Models.Client

<h1>Header</h1>
<img src="@Url.Content(Model.BannerUrl)" alt="Image" />
Run Code Online (Sandbox Code Playgroud)

小智 6

Using@Html.Partial()不调用控制器方法,只呈现部分中定义的 html。默认情况下,它将模型从主视图传递到局部视图(除非您在第二个参数中指定它),因此除非主视图中的模型是 typeof,否则TicketPaymentsAzureMVC.Models.Client您的代码将引发异常。

如果您使用包含属性的视图模型Client Client(并且您在 GET 方法中填充该属性),那么您可以使用

@Html.Partial("_Header", Model.Client)
Run Code Online (Sandbox Code Playgroud)

将 的实例传递Client给部分。这意味着使用该布局的每个视图都需要该属性。

更好的选择是使用@Html.Action()@{ Html.RenderAction(); }调用返回部分的服务器方法

[ChildActionOnly]
public ActionResult Header()
{
    Client model = ... // initialize your model and set the `BannerUrl` property
    return PartialView(_"Header", model);
}
Run Code Online (Sandbox Code Playgroud)

并在布局中

@{ Html.RenderAction("Header", yourControllerName); }
Run Code Online (Sandbox Code Playgroud)