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.