Я бы использовал атрибуты в действиях моего контроллера и добавил их к ViewData
в моем базовом контроллере в методе OnExecutingAction
.
. Мотивация поместить его в контроллер, а не вид, заключается в том, чтоэто действительно больше информации о действии, чем о представлении.И вы можете использовать его при возврате различных форматов, таких как json или xml.
Контроллер
class MyController
{
[MetaKeywords("hello,world,something,else")]
[MetaDescription("Tells you how to greet the world")]
ActionResult Hello()
{
return View();
}
}
Вы всегда можете использовать файл ресурсов вместо простых строк.
в базовом контроллере :
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
var keywords = filterContext.ActionDescriptor.GetCustomAttributes(typeof(MetaKeywordsAttribute), false);
if (keywords.Length == 1)
ViewData["MetaKeywords"] = keywords.Value;
var description = filterContext.ActionDescriptor.GetCustomAttributes(typeof(MetaDescriptionAttribute), false);
if (description.Length == 1)
ViewData["MetaDescription"] = description.Value;
base.OnActionExecuting(filterContext);
}
В вашем макете
<meta name="keywords" value="@View.MetaKeywords" />
И вототвечает на ваши вопросы: =)
1) Предвидите ли вы какие-либо проблемы с этим подходом?
Нет.Это хороший подход.
2) Есть ли более подходящие подходы?
Просто дал вам альтернативу.
3) Какое хранилище данных использовать здесь - следует ли мне извлекать данные из БД (или кэшировать, если данные доступны)), использовать файлы ресурсов, файлы конфигурации и т. д.?
Я бы написал это в виде простого текста (если вам не нужно поддерживать несколько языков), иначе в файле ресурсов.Эта информация, как правило, не изменяется, если только представление или контроллер не были изменены (где перекомпиляция необходима в любом случае).Следовательно, нет необходимости в более динамическом источнике.