2014-04-10 2 views
0

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

 <header> 

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

    </header> 

    <div id="body"> 

      @RenderBody() 

    </div> 

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

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

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

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

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

Спасибо!

ответ

0

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

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

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

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

ViewData["Data"]=data; 

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

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

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

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

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

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

0

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

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

В header.cshtml и нижний колонтитулы .cshtml вы добавляете динамические значения, используя запрос sql или linq.

1

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

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

1

Я думаю, что хороший подход состоял бы в том, чтобы сделать разделы частью вашего представления вывода с использованием определений разделов, а затем добавить их в макет с использованием метода «@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