Страница новостей со списком заголовков на боковой панели - PullRequest
0 голосов
/ 27 декабря 2018

Я довольно новичок в 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 голосов
/ 27 декабря 2018
@Html.Partial("_ArticleList")
// and
@{Html.RenderPartial("_ArticleList");}

Значит, загрузите страницу CSHTML и поместите ее здесь с текущей моделью (с более эффективными версиями рендеринга).Они без контроллера , что означает отсутствие вызова контроллера.

Если вам нужно загрузить HTML в отдельном контексте контроллера / метода, вы должны использовать один из следующих вариантов.

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

Опять же, использование опции рендеринга более производительно .

Проблема, с которой вы можете столкнуться, заключается в том, что оба действия / рендеринга будут отрисовываться с любыми имеющимися у вас макетами, вызываядействительно странный вывод (возможно, html-теги внутри предыдущих тегов body)Чтобы предотвратить это, вместо вызова View() вы можете вызвать PartialView() в вашем контроллере.

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());
}  
0 голосов
/ 27 декабря 2018

Замените @Html.Partial("_ArticleList") на @Html.Action("_ArticleList", "Articles"), который будет работать на вашем контроллере статей и должен использовать созданное вами частичное представление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...