【问题标题】:_Layout and Partial View_布局和局部视图
【发布时间】:2014-07-08 04:02:36
【问题描述】:

使用 MVC5 应用程序,我尝试在 _layout 页面中的局部视图中加载模型。这似乎不起作用,因为它与加载在不同视图中的其他模型冲突。

我找到了 ViewBags 的替代方案,但它很混乱,我认为这不是最好的方法。有没有办法在 _layout 页面内的模型中加载局部视图,以便从局部视图加载的模型不会与另一个模型冲突?

更新:

我想要做的是:

在 _layout 页面中。我正在尝试使用 bootstrap 提供的图像轮播与用户交互(因此用户可以更改图像、标题和子标题)。

我创建了一个模型来存储数据,例如标题等:

public class BannerEditor
{
    public int ID { get; set; }

    [Display(Name="Title")]
    [StringLength(150)]
    public string title { get; set; }

    [Display(Name = "Sub-Title")]
    [StringLength(300)]
    public string subTitle { get; set; }

    [Display(Name = "Image Path")]
    public string imgPath { get; set; }

    [Display(Name= "Starting Banner")]
    public int startBanner { get; set; }
} 

然后对于我的部分视图,我编写了一些代码并尝试加载模型。:

@model IEnumerable<webby.Models.BannerEditor>

@foreach (var item in Model)
{
    if (item.startBanner == 1)
    { 
    <div class="item active">
        <img src=@item.imgPath alt="...">
        <div class="carousel-caption">
            <h3>@item.title</h3>
            <p>@item.subTitle</p>
        </div>
    </div>
    }
    else
    {
        <div class="item">
            <img src=@item.imgPath alt="...">
            <div class="carousel-caption">
                <h3>@item.title</h3>
                <p>@item.subTitle</p>
            </div>
        </div>
    }
}

然后在我的 _Layout 页面中,我刚刚添加了 Partial。

    <div class="carousel-inner">
        @Html.Partial("BannerLoad")

这里是控制器:

    public ActionResult BannerLoad()
    {
         return PartialView(db.BannerEditors.ToList())
     }

它给了我一个错误,指出它无法将 Articles 模型加载到我的局部视图中。它需要加载的模型是 BannerEditor。由于我的 _layout 已加载到每个页面中,并且部分视图正在加载模型。局部视图的模型与所有其他加载的模型冲突。模型名称为“Articles”。

有没有办法解决这个问题?

【问题讨论】:

  • 这种情况下的控制器和视图是什么样的?你能举个例子吗?
  • 我更详细地描述了我想要完成的工作

标签: asp.net-mvc model partial-views


【解决方案1】:

对这类事情使用子操作。它们就像部分视图,但它们有自己的上下文,允许您获取和使用您需要的任何模型,而不会影响页面的其余部分:

控制器

[ChildActionOnly]
public ActionResult BannerLoad()
{
    var banners = db.BannerEditors.ToList();
    return PartialView(banners);
}

BannerLoad.cshtml

@model IEnumerable<Namespace.To.BannerEditor>

<!-- HTML to display your banners -->

_Layout.cshtml

@Html.Action("BannerLoad");

所有这些看起来都与您已有的非常相似,但有一些关键的区别:

  1. 部分不适用于动作,这实际上是使子动作成为子动作而不是部分的原因。在您当前的代码中,您似乎期望 Html.Partial 呈现您的 BannerLoad 操作,但它永远不会这样做。它只会将BannerLoad.cshtml 中的内容转储到页面上,因为它从未得到合适的模型,所以会导致错误。

  2. Partials 没有自己的上下文(因为它们不能在单独的操作中工作),因此它们必须从父视图接收模型。如果你没有传入模型(你没有传入),它们会自动传递给“当前”模型。这将是主要操作使用的视图的任何模型,并且显然会将操作更改为操作。例如,您不能在 _Layout.cshtml 上设置模型并将其传入,因为那不是原点。

  3. 即使您可以将模型设置为 _Layout.cshtml 之类的东西,也只适用于那个部分。如果你有任何其他部分,你仍然不走运。

【讨论】:

  • 这将解决我遇到的一个紧迫问题,我的用户配置文件区域是 _Layout 的一部分,由于模型冲突而无法正常工作。我喜欢你的解决方案,但它是如何工作的?子动作必须进入每个控制器吗?我也使用 mvc 和 razor 页面。似乎子动作必须可用于每个页面。我也尝试使用视图组件,但它们在模型冲突中也会出错。 BannerLoad.cshtml 是局部视图吗?
  • 我更喜欢查看组件,因为我需要将用户 ID 或电子邮件作为参数传递。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-15
  • 2013-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多