边栏中带有标题列表的新闻页面

时间:2018-12-27 17:31:28

标签: c# asp.net-mvc razor asp.net-mvc-5

我刚接触MVC。我正在尝试创建一个页面,从SQL Server数据库中提取新闻故事以填充页面的主要区域,而我的边栏列出了所有标题。我已经尝试过使用侧边栏的局部视图。

以下是填充视图的控制器代码:

        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>之间发生冲突。

有人可以提出解决方法吗?

2 个答案:

答案 0 :(得分:2)

@Html.Partial("_ArticleList")
// and
@{Html.RenderPartial("_ArticleList");}

意味着,加载CSHTML页面,并将其与当前模型放在一起(使用更高效的Render版本)。它们是 controllerless ,这意味着没有对控制器的调用。

如果您需要在单独的控制器/方法上下文中加载HTML,则可以使用以下选项之一。

@Html.Action("_ArticleList")
// and
@{Html.RenderAction("_ArticleList");}

再次使用Render Option is more performant

您可能遇到的问题是,动作/渲染都将使用您拥有的任何布局进行渲染,从而导致输出结果确实很奇怪(可能在先前的body标签中包含html标签)。为避免这种情况,您可以在控制器中调用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());
}  

答案 1 :(得分:1)

rm: cannot remove '/usr/local/airflow/logs': Device or resource busy rm: cannot remove '/usr/local/airflow/rootfs': Device or resource busy 替换为@Html.Partial("_ArticleList"),这将运行到Articles控制器,并应使用您创建的部分视图。