_Layout和Partial View

时间:2014-07-07 18:41:15

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

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

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

更新

我想做的是:

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

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

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被加载到每个页面,并且局部视图正在加载模型。局部视图的模型与每个其他加载的模型冲突。型号名称为“文章”。

有解决方法吗?

1 个答案:

答案 0 :(得分:2)

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

<强>控制器

[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没有自己的上下文(因为它们不在单独的操作中工作),所以他们必须从父视图接收他们的模型。如果你没有通过模型(你不是),他们会自动通过&#34;当前&#34;模型。这将是主要操作使用的视图的任何模型,并且显然会将操作更改为操作。例如,您无法在_Layout.cshtml上设置模型,并将其传入,因为它不是原点。

  3. 即使您可以在类似_Layout.cshtml之类的地方设置模型,但这只适用于那个部分。如果你有任何其他部分,你仍然没有运气。