Я бы сохранил макеты на диске, потому что на данный момент я не вижу никаких преимуществ в базе данных (если вы этого не сделаете). Но стоит упомянуть одну вещь: вы можете создать класс, производный от OutputCacheAttribute , и ваш сохраненный результат будет зависеть от используемого вами макета.
Зависит ли макет от пользователя? Вы можете использовать свойство VaryByCustom , чтобы оно варьировалось в зависимости от пользователя.
EDIT
Разрешено ли вашим пользователям динамически изменять макеты? Если да, у вас также должен быть гид, связанный с вашими пользователями, который будет меняться каждый раз при изменении макетов, поэтому вы возвращаетесь к своему методу VaryByCustom:
return string.Format("User-{0}-{1}", user.Id, user.LayoutUpdateGuid);
Видите смысл этого? Таким образом, когда пользователь изменяет макеты, они сразу же видят, что его страницы обновляются.
Как применить атрибут VaryByCustom в вашей ситуации
В своем методе действий вы можете использовать:
[OutputCache(Duration = 3600, VaryByCustom = "UserLayouts")]
public ActionResult Details(string param)
{
// Returning the view
}
Затем в вашем методе VaryByCustom в файле Global.asax.cs:
protected override string VaryByCustom(string custom)
{
switch (custom)
{
case "UserLayouts":
//// Here you fetch your user details so you can return a unique
//// string for each user and "publishing cycle"
//// Also, I strongly suggest you cache this user object and expire it
//// whenever the user is changed (e.g. when the LayoutUpdateGuid is
//// changed) so you achieve maximum speed and not defeat the purpose
//// of using output cache.
return string.Format("User-{0}-{1}", user.Id, user.LayoutUpdateGuid);
break;
}
}
Недостающий кусок
Недостающий элемент здесь заключается в том, что вам нужно сохранить значение, которое я назвал LayoutUpdateGuid (я уверен, вы найдете более подходящее имя), и изменять это значение всякий раз, когда пользователь изменяет свои макеты => это приведет к Строка, возвращаемая методом VaryByCustom (string) в Global.asasx.cs, что, в свою очередь, заставит ваш метод действия выполнить снова и вернуть результат с обновленным макетом.
имеет для вас смысл?
Примечание: я не могу проверить конкретный код, который я написал здесь, но я уверен (кроме опечаток), что он правильный.