Mvc Layout динамический контент страницы

У меня есть страница макета MVC (главная страница) с некоторым динамическим содержимым в верхнем и нижнем колонтитулах.

       <header>

        @Html.Action("GetHeader", "Layout")

    </header>

   <div id="body">

           @RenderBody()

    </div>

    <footer>
        @Html.Action("GetFooter", "Layout")
    </footer>

Методы действия GetHeader и GetFooter получают значения из базы данных в объект и возвращают частичное представление на основе свойств верхнего / нижнего колонтитула этого объекта.

Но дело в том, что я не хочу делать два вызова базы данных, потому что они оба используют один и тот же тип объекта.

так есть ли способ, чтобы я мог вызвать базу данных только один раз и сохранить этот объект и использовать его на странице макета, не вызывая базу данных несколько раз?

Любое решение, кроме использования viewbag, будет очень полезно.

Спасибо!

4 ответа

Кэшируйте значение в статическом свойстве с помощью статического частного вспомогательного поля. В получателе проверьте, является ли поле поддержки нулевым. Если это нуль, тогда запросите базу данных и установите это. Сделайте так, чтобы свойство вернуло вспомогательное поле.

Это должно быть на вашем уровне доступа к данным. Это называется одноэлементным паттерном.

Я думаю, что хорошим подходом было бы визуализировать разделы как часть вывода вашего представления, используя определения разделов, а затем добавить их в макет с помощью метода "@RenderSection".

<header>
   @RenderSection("AdditionalHeader", required: false)
</header>
<div id="body">
   @RenderBody()
</div>
<footer>
   @RenderSection(("AdditionalFooter", "Layout")
</footer>

Затем, на ваш взгляд, создайте разделы для рендеринга:

@Section AdditionalHeader
{
   <whatever content you want to generate from action>
}
@Section AdditionalFooter
{
   <whatever content you want to generate from action>
}

Это должно работать с MVC 3 и вперед. Скотт Гатри написал более подробную статью, если вам нужно больше деталей:

http://weblogs.asp.net/scottgu/asp-net-mvc-3-layouts-and-sections-with-razor

Используйте этот способ. Создайте header.cshtml для заголовка и footer.cshtml для нижнего колонтитула в общей папке.

Затем вызовите эту страницу.cshtml на странице макета, используя @{Html.RenderPartial("header");} и @{Html.RenderPartial("footer");}

На странице header.cshtml и footer.cshtml вы помещаете динамические значения, используя SQL-запрос или LINQ-запрос.

Модифицированный ответ:

Вы можете использовать ViewBag, ViewData и т. Д., Доступные в MVC, для хранения данных из вашей базы данных и их использования в приложении MVC без необходимости их повторного вызова.

Эта ссылка объясняет о них, вы можете использовать его в зависимости от ваших требований.

Все, что вам нужно сделать, это сохранить данные из базы данных в вашем методе основного действия (индекс по умолчанию),

ViewData["Data"]=data;

data может быть объектом любого типа, который содержит значение из базы данных.

На странице просмотра вы можете передать его другим методам действий, таким как

@Html.Action("ActionMethod", (ObjectTypeOfData)ViewData["Data"])

В вашем методе действия вы можете получить его как параметр, как,

public ActionResult ActionMethod(ObjectTypeOfData data){ .... your code ....}

Примечание. Если вы не хотите получать данные из базы данных во время обратной отправки, используйте Session вместо ViewData.

Другие вопросы по тегам