【问题标题】:ASP.NET MVC Routes and Client Specifc FunctionsASP.NET MVC 路由和客户端特定函数
【发布时间】:2011-07-31 07:50:02
【问题描述】:

我正在开发一个正在构建系统的应用程序,其中多个“客户”将使用该系统,并且 99.9% 的控制器/操作将是相同的,只是提取不同的数据,但在某些时间和地点可能需要自定义控制器操作或视图。

现在我正在使用类似于以下的默认路由来获取带有请求的公司名称。

routes.MapRoute(
    "Default", // Route name
    "{company}/{controller}/{action}/{id}",
    new {company = "Unknown", controller = "Home", 
    action = "Index", id = UrlParameter.Optional} 
    );

这很好用,因为我可以像这样定义我的个人控制器操作

public ActionResult ShowReport(string company)
{
    //Actual code goes here..
}

我有一个系统可以获取该特定公司的数据段并返回正确的视图。所以对于我 99.9% 的情况,这看起来很棒。当我需要呈现不同的视图或有特定于一家公司的其他操作时,我正在寻找一种解决方案。

我可以在我的操作中添加开关或其他逻辑,但这感觉太脏了......

【问题讨论】:

  • 建议的最佳做法是使控制器尽可能纤薄。将这种逻辑推入你的模型怎么样?让它足够聪明,知道给定公司需要哪些额外数据。
  • Jay 我同意,但最重要的是,对于某些客户来说,功能确实不同,但仅限于非常有限的情况。

标签: asp.net-mvc-3 architecture multi-tenant


【解决方案1】:

对于特定的公司,您可以使用类似的内容并将其放在默认操作之前,在这种情况下,url 必须包含 Company1/somethingcontroller/etc/etc。

routes.MapRoute(
    "Company1Default", // Route name
    "Company1/{controller}/{action}/{id}",
    new {company = "Company1", controller = "DefaultControllerForCompany1", 
    action = "Index", id = UrlParameter.Optional} 
    );

【讨论】:

  • 你知道我认为这可能是最好的。我可以稍微扩展一下,只覆盖一组特定的功能。我要试试这个。
【解决方案2】:

虽然我实际上倾向于 Jay 关于在模型中使用数据的回答,但我认为还有另一种选择。请注意,我还没有完全玩过这个,并且对您的应用程序没有完全了解...

为什么要在 global.asax 中硬编码公司名称?我不认为它具有很强的可扩展性。如果要添加对另外 10 家公司的支持,则必须创建 10 个新条目。另外,如果您因为收购或其他原因想更改公司名称怎么办?更多维护。

为什么不添加一个路由来将每个公司发送到同一个控制器,比如......

routes.MapRoute(  
    "CompanyRouting", // Route name  
    "{companyname}/{action}",  
    new { controller = "MySingleCompanyControllerName", action = "Index", companyname = UrlParameter.Optional }  
);

MySingleCompanyController.cs
进入控制器后,您可以随时获取 companyname 值。

public ActionResult Index()
{
    ViewData["companynamevalue"] = RouteData.Values["companyname"];
    return View();
}

Index.aspx

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Index</title>
</head>
<body>
    <div>
        Requested Company Name = <%: ViewData["companynamevalue"] %>
    </div>
</body>
</html>

注意:寻找路由帮助的另一件事是 Phil Haack 的 routing debugger

【讨论】:

  • 你是对的,硬编码的值不是“伟大”的东西,但唯一一次硬编码是如果有针对特定公司的定制,因此它应该是可以接受的跨度>
【解决方案3】:

定义从动作返回的视图很容易:

return View("Index");

无论调用哪个操作,这都会返回名为“Index”的视图。

另一方面,视图和动作都必须在编译时定义,因此您不能动态创建它们(据我所知)。

我可能会建议在您的操作中实施Command Pattern,以便通过一次操作准确地获得您对各个公司的期望。

【讨论】:

    猜你喜欢
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-22
    • 1970-01-01
    • 1970-01-01
    • 2021-03-20
    • 2010-09-24
    相关资源
    最近更新 更多