侧边栏中带有标题列表的新闻页面
News page with headline list in sidebar
我是 MVC 的新手。我正在尝试创建一个页面,其中从 SQL 服务器数据库中提取新闻报道以填充页面的主要区域,同时我有一个侧边栏,其中列出了所有标题。我试过对侧边栏使用局部视图。
这是填充视图的控制器代码:
public ActionResult _ArticleList()
{
return View(db.Articles.OrderByDescending(a => a.id).ToList());
}
public ActionResult Details(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Articles articles = db.Articles.Find(id);
if (articles == null)
{
return HttpNotFound();
}
return View(articles);
我的主要观点 - Details.cshtml
@model MyApplication.Models.Articles
<div id="container">
{
<div id="main" class="col-md-9">
<h2> @Html.DisplayFor(model => model.Headline)</h2>
<p style="white-space:pre-line">
@Html.DisplayFor(model => model.Content)
</p>
</div>
<div id="rightnav" class="col-md-3">
@Html.Partial("_ArticleList")
</div>
</div>
和我的部分观点 - _ArticleList.cshtml
@model IEnumerable<MyApplication.Models.Articles>
@foreach (var item in Model)
{
<a href="/Details/@item.id"> @Html.DisplayFor(modelItem => item.Headline)</a>
<br>
}
主视图中的 @model MyApplication.Models.Articles
和部分视图中的 @model IEnumerable<MyApplication.Models.Articles>
之间存在冲突。
任何人都可以提出解决这个问题的方法吗?
将 @Html.Partial("_ArticleList")
替换为 @Html.Action("_ArticleList", "Articles")
,这将 运行 您的文章控制器并且应该使用您创建的部分视图。
@Html.Partial("_ArticleList")
// and
@{Html.RenderPartial("_ArticleList");}
意味着,加载 CSHTML 页面并将其与当前模型一起放在此处(渲染版本更高效)。它们 controllerless 意味着没有调用控制器。
如果您需要在单独的 controller/method 上下文中加载 HTML,那么您将使用以下方法之一。
@Html.Action("_ArticleList")
// and
@{Html.RenderAction("_ArticleList");}
再次使用 Render Option is more performant。
您可能遇到的问题是,Action/Render 将与您拥有的任何布局一起呈现,从而导致非常奇怪的输出(html 标签可能在先前的 body 标签中)。为防止这种情况,您可以在控制器中调用 PartialView()
而不是调用 View()
。
public ActionResult _ArticleList()
{
return PartialView(db.Articles.OrderByDescending(a => a.id).ToList());
}
我还建议您 锁定 这个方法,这样它只能被 Action()
或 RenderAction()
使用 ChildActionOnlyAttribute.
[ChildActionOnly]
public ActionResult _ArticleList()
{
return PartialView(db.Articles.OrderByDescending(a => a.id).ToList());
}
我是 MVC 的新手。我正在尝试创建一个页面,其中从 SQL 服务器数据库中提取新闻报道以填充页面的主要区域,同时我有一个侧边栏,其中列出了所有标题。我试过对侧边栏使用局部视图。
这是填充视图的控制器代码:
public ActionResult _ArticleList()
{
return View(db.Articles.OrderByDescending(a => a.id).ToList());
}
public ActionResult Details(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Articles articles = db.Articles.Find(id);
if (articles == null)
{
return HttpNotFound();
}
return View(articles);
我的主要观点 - Details.cshtml
@model MyApplication.Models.Articles
<div id="container">
{
<div id="main" class="col-md-9">
<h2> @Html.DisplayFor(model => model.Headline)</h2>
<p style="white-space:pre-line">
@Html.DisplayFor(model => model.Content)
</p>
</div>
<div id="rightnav" class="col-md-3">
@Html.Partial("_ArticleList")
</div>
</div>
和我的部分观点 - _ArticleList.cshtml
@model IEnumerable<MyApplication.Models.Articles>
@foreach (var item in Model)
{
<a href="/Details/@item.id"> @Html.DisplayFor(modelItem => item.Headline)</a>
<br>
}
主视图中的 @model MyApplication.Models.Articles
和部分视图中的 @model IEnumerable<MyApplication.Models.Articles>
之间存在冲突。
任何人都可以提出解决这个问题的方法吗?
将 @Html.Partial("_ArticleList")
替换为 @Html.Action("_ArticleList", "Articles")
,这将 运行 您的文章控制器并且应该使用您创建的部分视图。
@Html.Partial("_ArticleList")
// and
@{Html.RenderPartial("_ArticleList");}
意味着,加载 CSHTML 页面并将其与当前模型一起放在此处(渲染版本更高效)。它们 controllerless 意味着没有调用控制器。
如果您需要在单独的 controller/method 上下文中加载 HTML,那么您将使用以下方法之一。
@Html.Action("_ArticleList")
// and
@{Html.RenderAction("_ArticleList");}
再次使用 Render Option is more performant。
您可能遇到的问题是,Action/Render 将与您拥有的任何布局一起呈现,从而导致非常奇怪的输出(html 标签可能在先前的 body 标签中)。为防止这种情况,您可以在控制器中调用 PartialView()
而不是调用 View()
。
public ActionResult _ArticleList()
{
return PartialView(db.Articles.OrderByDescending(a => a.id).ToList());
}
我还建议您 锁定 这个方法,这样它只能被 Action()
或 RenderAction()
使用 ChildActionOnlyAttribute.
[ChildActionOnly]
public ActionResult _ArticleList()
{
return PartialView(db.Articles.OrderByDescending(a => a.id).ToList());
}