如何在mvc 3中跨视图和部分视图传递变量?

时间:2011-11-28 19:10:43

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

我正在创建一个包含标题/ URL集合的面包屑部分视图。该集合将以动作方法生成,并且必须在面包屑局部视图中可用。

我尝试了几种方法来完成它,这是其中之一:http://goo.gl/rMFlp

但有些我无法让它发挥作用。我得到的是“对象引用未设置为对象的实例”。你能帮助我吗?

{Updare} 这是代码:

我创建了一个Model类,如下所示

public class ShopModel
{
    public Dictionary<string,string> Breadcrumb { get; set; }
}

行动方法

public ActionResult Index()
    {
        var breadcrumbCollection = new Dictionary<string,string>();
        breadcrumbCollection.Add("/home","Home");
        breadcrumbCollection.Add("/shop","Shop");

        var model = new ShopModel() { Breadcrumb = breadcrumbCollection};

        return View(model);
    }

模型绑定视图 - 索引

@Model NexCart.Model.Model.Custom.ShopModel

最后,这是部分视图的代码:

<div>
@{
    foreach (var item in @Model.Breadcrumb)
    {
        <a href="#">@item.Key</a>
    }
    }

1 个答案:

答案 0 :(得分:1)

您没有显示任何代码,因此无法回答您的问题。这就是说你如何继续下去。与ASP.NET MVC应用程序一样,您首先要定义视图模型:

public class Breadcrumb
{
    public string Title { get; set; }
    public string Url { get; set; }
}

然后你可以编写一个控制器动作来填充一组面包屑并将它们传递给局部视图:

public class BreadcrumbController: Controller
{
    public ActionResult Index()
    {
        // TODO: pull the breadcrumbs from somewhere instead of hardcoding them
        var model = new[]
        {
            new Breadcrumb { Title = "Google", Url = "http://www.google.com/" },
            new Breadcrumb { Title = "Yahoo", Url = "http://www.yahoo.com/" },
            new Breadcrumb { Title = "Bing", Url = "http://www.bing.com/" },
        };
        return PartialView(model);
    }
}

然后你可以有一个相应的局部视图来渲染这个模型(~/Views/Breadcrumb/Index.cshtml):

@model IEnumerable<Breadcrumb>
<ul>
    @Html.DisplayForModel()
</ul>

和相应的显示模板(~/Views/Breadcrumb/DisplayTemplates/Breadcrumb.cshtml):

@model Breadcrumb
<li>
    <a href="@Model.Url">@Model.Title</a>
</li>

现在剩下的就是使用Html.Action helper在某处包含这个子动作。例如,如果在每个页面上重复此痕迹,则可以在_Layout中执行此操作:

@Html.Action("Index", "Breadcrumb")

但显然它也可以在任何视图中完成。