所以我有一个MVC应用程序,它应该更改网站标题,并根据应用程序所针对的域标题颜色。所以我在SQL中有一个简单的表设置:
DomainName(PK),WebsiteTitle,HeaderColor
Domain1.com,域名1的网站标题,#ebebeb
所以我试图找出为每个页面视图返回此信息的最佳方法。当然,我可以继续查找从控制器返回的每个模型中的站点信息。但还有其他方法可以解决这个问题吗?也许在堆栈的较低级别?
谢谢!
答案 0 :(得分:1)
有很多方法可以做到这一点。 ActionFilters是单向的,或者在BaseController中。
您需要确定每个操作是否需要此操作,或者仅确定是否执行某些操作。
如果您决定每个操作,请创建一个控制器库,继承自Controller,然后重写OnActionExecuting。在该方法中,您可以调用fetch并将数据添加到viewdata。像这样:
public class BaseController : Controller
{
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.Controller.ViewData.Add("SiteTitle", "Site title");
base.OnActionExecuting(filterContext);
}
}
如果您更喜欢使用具有此信息的基本视图模型,则最好覆盖OnActionExectued,您可以在其中访问操作结果,并修改基本模型以设置您的值。像这样:
public class BaseController : Controller
{
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
var result = filterContext.Result as ViewResultBase;
var baseModel = (BaseViewModel) result.ViewData.Model;
baseModel.SiteTitle = "Site Title";
base.OnActionExecuted(filterContext);
}
}
具体取决于您是否需要视图模型的继承链。要么有效。您还会注意到我只是设置了值。使用任何来源获取您需要的值。如果你要从数据库中提取它们,我会缓存这些值,以便每次操作都不会为数据库命中它。
答案 1 :(得分:0)
此问题与交换移动与桌面浏览器的布局或母版页基本相同。但是,您不必查看Web请求中的设备上限来确定要使用的布局,而是检查请求的域。
See this article for a slightly complex (but thorough) overview of selecting mobile vs desktop views。作者所说的大部分内容都集中在检测屏幕解决方案等方面,而这些解决方案并不直接适用于您,但选择主页面或布局页面的机制应该就是您所需要的。
或者,您可以通过继承处理此问题。
实现基本控制器,如下所示:
public class BaseController : Controller
{
public string SiteTitle { get { .... } }
public string HeaderColor { get { ... } }
/// whatever other "global" properties you need
}
然后,每个控制器都继承自BaseController
public class HomeController : BaseController
{
public ActionResult Index()
{
var myTitle = SiteTitle;
/// then, do whatever you want with it
return View();
}
}
在BaseController
的属性访问者中,从.settings
文件或AppSettings
中的web.config
部分阅读标题及其他所需的属性。
Controller
还提供了可用于设置这些属性的事件,因此您无需复制任何代码即可将这些值添加到每个视图中。