ASP MVC - ViewBag 从部分到视图

ASP MVC - ViewBag from partial to view

我需要在部分视图中设置 属性 ViewBag 并在视图中调用。这是我的代码: 这是 index.cshtml:

<h2>@ViewBag.Title</h2>
Html.RenderPartial("~/Views/Article/Partial.cshtml");

而这个控制器:

public ActionResult Index(int id)
{
  return View(_db.Articles.Find(id));
}

这是Partial.cshtml:

@model Article
@{
    ViewBag.Title = Model.Article.Title;
}

<h2>....</h2>
//html...

根据您在上面提供的代码,您似乎在部分视图中设置了 ViewBag.Title,并试图在索引视图中使用它。这行不通。您似乎还想写文章的标题,部分标题不会修改页面标题。

你应该考虑在哪里设置Title;在控制器操作中或在主视图中。这是一个例子:

控制器

public ActionResult Index(int id)
{
     ViewBag.Title = "My Title";
     return View(_db.Articles.Find(id));
}

修改您的 Index.cshtml 文件:

Index.cshtml

@model Article

<h2>@ViewBag.Title</h2>
@Html.Partial("_Partial", Model)

然后更新部分。请注意,Razor 引擎足够智能,可以确定要使用哪个 cshtml 文件,因此您无需为其提供完整路径。一般的命名约定是以下划线开头的部分。

_Partial.cshtml

@model Article

<h2>@Model.Title</h2>
...

我不太清楚你的模型是如何设置的,所以你可能想改变它。您还应该考虑为什么选择使用部分而不是将所有内容都构建到索引文件中。

如果想法是页面应该只显示一篇文章(Linq 查询似乎暗示了这一点),您可以将它全部构建在一个视图上。这是一个例子:

提议Index.cshtml

@{
    ViewBag.Title = Model.Title;
}

@model Article

<h2>@Model.Title</h2>
<p>@Model.Content<p>

当然,这只是一个示例,您应该根据需要应用格式。这会将页面标题(在浏览器中)设置为 "Site Name - Article Title",并在 h2 元素中显示标题。

你调用局部视图的方式是错误的。您的局部视图需要一个 Article 模型。像这样更改对局部视图的调用 Html.Partial("Partial", Model) -- 这里的模型是 Index.cshtml 中可用的模型(这是您从控制器中的 Index 操作方法传递的文章。