如何将数据传递给嵌套布局

时间:2014-04-07 13:35:51

标签: c# asp.net-mvc asp.net-mvc-4

让我们说我想在我的.NET MVC 4应用程序中扩展我的布局。所以我以一种非常简单的方式创建了一个嵌套布局:

_Root.cshtml

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <link href="~/favicon.ico" rel="shortcut icon" type="image/x-icon" />
    <meta name="viewport" content="width=device-width" />
</head>
<body>
    @RenderBody()
</body>

_productView.cshtml

@{
Layout = "~/Layouts/_Root.cshtml";
}

_productListView.cshtml

@{
Layout = "~/Layouts/_Root.cshtml";
}

现在我从我的数据库中获取了一个产品,并希望在_productView.cshtml中设置产品类别的标题。例如,假设我想要一个电子产品的标题。我想在我创建一个viewmodel并在我的控制器中返回一个视图之前从数据库中获取产品时这样做:

ProductController的

public ActionResult Index(string id) {
        var product= repository.GetById(new Guid(id));

        if(product== null) {
            throw new HttpException(404, "Not Found");
        }

        var model = Mapper.Map<IProduct, ProductViewModel>(product);

        return View(model);
    }

我想要做的是从产品中获取产品类型并在_productView.cshtml中使用它,但我知道无法使用viewbag。那我怎么能这样做呢?

关心乔纳森

更新 我将扩展这个例子:

如果我在我的控制器中执行此操作:

public ActionResult Index(string id) {
        var product= repository.GetById(new Guid(id));

        if(product== null) {
            throw new HttpException(404, "Not Found");
        }
                    Viewbag.ProductType = product.productType;

        var model = Mapper.Map<IProduct, productViewModel>(product);

        return View(model);
    }

然后在我的productView.cshtml

_productView.cshtml

@{
Layout = "~/Layouts/_Root.cshtml";
}
@Viewbag.productType

我会收到编译错误,告诉我当前上下文中不存在viewbag。

我对该产品的看法如下:

@model producttest.product.Web.ProductViewModel

@{
Layout = "~/Layouts/_productView.cshtml";
ViewBag.Title = @Model.Name;

}


<h1>@Model.Name)</h1>
<section>
<h2>@Model.Description, @Model.Price</h2>
<p>
    @Model.ImageUrl<br />
</p>
</section>

这是我试图实现的目标,但我已经知道viewbag不能以这种方式使用,我怎么能用另一种方式呢?

更新2:

Viewbag只是一个错字,这是实际的代码:

Compiler Error Message: CS0103: The name 'ViewBag' does not exist in the current context

Source Error:

Row 3:      
Row 4:  }
Row 5:  @ViewBag.productType;

2 个答案:

答案 0 :(得分:2)

首先要注意的是,您不需要在视图中使用此功能

<body>
@RenderBody()
</body>

这仅在您的布局中需要。请记住,@ RenderBody是您的View Markup的占位符。

我建议您强烈键入视图以使用ViewModel,这是一个POCO,表示您希望传递给视图的数据。有些人只是传递他们正在使用的对象,这是有效的,但有时你使用的对象和你想在视图上表示的内容可能不同,所以拥有单独的ViewModel更有意义。

您可以使用此标记您的视图以选择所需的强类型对象。

@model MyProject.ViewModels.MyViewModel

然后,您可以直接在视图中访问属性

@Model.MyProperty

答案 1 :(得分:0)

我明白了!由于我使用嵌套布局结构,我将布局从View文件夹移动到名为“Layouts”的单独文件夹。在每个“Views”文件夹中都有一个引用名称空间的Web.config,因为我将布局复制到另一个文件夹,所以此文件丢失了。

感谢@JMK和@David Hirst的帮助,这导致我这样做!

关注乔纳森