让我们说我想在我的.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;
答案 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的帮助,这导致我这样做!关注乔纳森