2010-11-04 3 views
9

Я в настоящее время разрабатываю веб-сайт, используя asp.net mvc 2 в C#. Я никогда не использовал функцию кэширования в MVC и хотел бы применить ее к странице профиля пользователя. Содержимое на этой странице редко изменяется, и единственной частью, которая должна быть в реальном времени, является список последних сообщений пользователя. (Я использую linq-to-sql для загрузки данных из базы данных)Asp.net MVC 2 кэширование

Мне нужны некоторые предложения о том, какую технику кеширования я должен использовать и как ее реализовать?

Обновление: Решение Xandy ниже почти работает, за исключением того, что я не могу передать данные. Как мне переписать это с помощью? Html.RenderPartial ("UserPosts", ViewData ["UserPosts"])

+0

См. Также http://stackoverflow.com/questions/4082826/when-and-how-to-go-about-performing-caching-in-asp-net-mvc/4091232#4091232 –

+0

Кто-нибудь знает ответ? к моему обновлению? – Rana

+0

вам нужно использовать четвертую перегрузку для RenderPartial (http://msdn.microsoft.com/en-us/library/dd470561.aspx): «Html.RenderPartial (« UserPosts.ascx », Model.UserPosts, новый ViewDataDictionary {Model = Model.UserPosts} '. – RPM1984

ответ

1

ASP.Net имеет tutorial on output caching for MVC.

Partial (aka Donut) Caching который будет работать для MVC2.

+0

Да, я тоже это видел. Но как я могу кэшировать страницу, пока ее часть не кэширована? – Rana

+0

на следующей странице о частичном кэшировании. http://www.asp.net/mvc/tutorials/adding-dynamic-content-to-a-cached-page-cs – xandy

+0

Является ли это еще предпочтительным методом в MVC 2? – Rana

5

Как и другие ответы заявили, пончик кэширование «своего рода» работает в MVC.

я бы не рекомендовал его - вместо того, чтобы я буду предлагать alterantive:

у Вас есть представление для пользователей профиля, давайте назовем это «UserProfile.aspx».

Теперь в этом представлении у вас есть куча HTML, в том числе раздел для «недавних сообщений».

Теперь, я предполагаю, что это что-то вроде последние 10 сообщений для пользователя.

Что я бы сделать, это положить этот HTML/раздел в Частичный вид, и служить ему с помощью метода отдельной акции, иначе в PartialViewResult:

public class UserProfileController 
{ 
    [HttpGet] 
    [OutputCache (Duration=60)] 
    public ActionResult Index() // core user details 
    { 
     var userProfileModel = somewhere.GetSomething(); 
     return View(userProfileModel); 
    } 

    [HttpGet] 
    public PartialViewResult DisplayRecentPosts(User user) 
    { 
     var recentPosts = somewhere.GetRecentPosts(user); 
     return PartialViewResult(recentPosts); 
    } 
} 

вынести из Partial View с помощью JQuery:

<script type="text/javascript"> 
    $(function() { 
    $.get(
     "/User/DisplayRecentPosts", 
     user, // get from the Model binding 
     function (data) { $("#target").html(data) } // target div for partial 
    ); 
    }); 
</script> 

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

Метод jQuery рендеринга частичного отличается от RenderPartial, так как вы обслуживаете HTML непосредственно с контроллера, поэтому вы можете соответствующим образом контролировать выходное кэширование.

Конечный результат очень похож на кэширование пончиков (части страницы кэшированы, другие нет).

+1

Так как насчет клиентов без javascript? – xandy

+2

Было ли это требование, заявленное ОП? – RPM1984

Смежные вопросы