MVC +多租户应用

时间:2012-02-08 15:35:42

标签: asp.net-mvc

所以我有一个MVC应用程序,它应该更改网站标题,并根据应用程序所针对的域标题颜色。所以我在SQL中有一个简单的表设置:

DomainName(PK),WebsiteTitle,HeaderColor

Domain1.com,域名1的网站标题,#ebebeb

所以我试图找出为每个页面视图返回此信息的最佳方法。当然,我可以继续查找从控制器返回的每个模型中的站点信息。但还有其他方法可以解决这个问题吗?也许在堆栈的较低级别?

谢谢!

2 个答案:

答案 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还提供了可用于设置这些属性的事件,因此您无需复制任何代码即可将这些值添加到每个视图中。