Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 ASP.NET MVC路由和客户端特定函数_Asp.net Mvc 3_Architecture_Multi Tenant - Fatal编程技术网

Asp.net mvc 3 ASP.NET MVC路由和客户端特定函数

Asp.net mvc 3 ASP.NET MVC路由和客户端特定函数,asp.net-mvc-3,architecture,multi-tenant,Asp.net Mvc 3,Architecture,Multi Tenant,我正在开发一个应用程序,其中正在构建一个系统,其中多个客户将使用该系统,99.9%的控制器/操作将是相同的,只是拉取不同的数据,但在某些时间和地点可能需要自定义控制器操作或视图 现在,我使用一个类似于下面的默认路由来获取带有请求的公司名称 routes.MapRoute( "Default", // Route name "{company}/{controller}/{action}/{id}", new {company = "Unknown", controller

我正在开发一个应用程序,其中正在构建一个系统,其中多个客户将使用该系统,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%的情况来说,这看起来很棒。我所寻找的是一个解决方案,当我需要呈现不同的视图,或有特定于一家公司的其他操作时


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

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

return View("Index");
无论调用哪个操作,都将返回名为Index的视图

另一方面,视图和操作都必须在编译时定义,因此您无法根据我所知道的动态创建它们


我可能建议在您的操作中实现,以便从单个操作中获得您想要的各个公司的确切信息。

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

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

虽然我实际上倾向于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


注意:路由帮助的另一个方面是Phil Haack的。

建议的最佳实践是使控制器尽可能苗条。把这种逻辑推进你的模型怎么样。让它足够智能,以了解特定公司需要哪些额外数据。Jay我同意,但最重要的是,对于某些客户来说,功能确实不同,但仅在非常有限的情况下。你知道,我认为这可能是最好的。我可以稍微扩展一下,只覆盖一组特定的功能。我要试试这个。你是对的,硬编码值不是一件好事,但它唯一会硬编码的时间是,如果有一个特定公司的定制,因此它应该是可以接受的
<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>