【问题标题】:Controller for partial view in layout page MVC布局页面 MVC 中部分视图的控制器
【发布时间】:2017-02-03 20:29:07
【问题描述】:

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

布局页面

<!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>

局部视图

@model TicketPaymentsAzureMVC.Models.Client

<h1>Header</h1>
<img src="@Url.Content(Model.BannerUrl)" alt="Image" />

【问题讨论】:

  • 您遇到错误了吗?有什么问题?你在模型中设置属性 BannerUrl 吗?
  • 没有错误,我想我不确定如何或在哪里设置属性。局部视图是否使用自己的控制器?我在哪里执行我的逻辑并传递给它?
  • 我回答了你的问题。我认为在布局中进行 AJAX 调用是最好的方法。如果您执行@Html.Partial(...),部分视图使用与当前视图中相同的模型(或模型的子集)。您可以使用 AJAX 调用生成局部视图,但在这种情况下,我认为最好进行 AJAX 调用并仅获取图像 url。
  • 您使用的是哪个版本的 .net?如果您使用的是 .net Core,请查看视图组件。它们有点像局部,但它们也有一个控制器! docs.microsoft.com/en-us/aspnet/core/mvc/views/view-components
  • 所以没有办法使用控制器来做到这一点?我需要使用其他 C# 库和方法来获取必要的信息。

标签: asp.net-mvc razor model-view-controller


【解决方案1】:

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

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

@Html.Partial("_Header", Model.Client)

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

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

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

在布局中

@{ Html.RenderAction("Header", yourControllerName); }

【讨论】:

  • 我在尝试这个The controller for path '/' was not found or does not implement IController.时遇到了这个错误
  • @Matthew,这表明您的代码中有错误。我猜不出你的代码是什么,所以我建议你问一个包含所有相关细节的新问题
【解决方案2】:

我能想到的所有选项:

1) 在使用该布局的所有操作之间共享模型。

2) 使用 ViewBag。链接:https://msdn.microsoft.com/en-us/library/system.web.mvc.controllerbase.viewbag(v=vs.118).aspx

3) 使用 RenderAction(布局不依赖于执行的操作)。链接:https://msdn.microsoft.com/en-us/library/ee839451(v=vs.98).aspx

4) 从布局中引用的 JS 文件进行 AJAX 调用(布局不依赖于执行的操作)。链接:http://www.aspsnippets.com/Articles/ASPNet-MVC-jQuery-AJAX-and-JSON-Example.aspx

您需要为具有属性 BannerUrl 的模型定义一个基类。您可以使用 ViewBag 来避免这种情况,但我也不喜欢这种解决方案。

我会这样做:

1) 创建一个名为 layout.js 的 JS 文件。该文件将对获取横幅 URL 进行 AJAX 调用并进行设置。

2) 在布局中,引用(1)中创建的JS文件。

3) 任何使用布局的页面都不需要做任何事情。布局自己处理,所以没有依赖关系。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-09
    • 1970-01-01
    • 2017-06-05
    • 2020-12-14
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 2012-01-01
    相关资源
    最近更新 更多