Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.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
C# 如何在现有asp.net-mvc站点上添加新路由而无需大量重写?_C#_Sql Server_Asp.net Mvc_Nhibernate_Refactoring - Fatal编程技术网

C# 如何在现有asp.net-mvc站点上添加新路由而无需大量重写?

C# 如何在现有asp.net-mvc站点上添加新路由而无需大量重写?,c#,sql-server,asp.net-mvc,nhibernate,refactoring,C#,Sql Server,Asp.net Mvc,Nhibernate,Refactoring,我有一个带有SQL server后端的asp.net-MVC网站。有100个不同的表格,这个网站为300人的组织工作 我们现在想将它用于另一个组织,然后出现了一个如何扩展站点的技术问题。以下是一些要求: 背景: 有许多表可以在两个组织中完全重用,但也有许多表需要添加过滤器,以确保只返回与特定组织相关的记录 考虑到这一点,我有or(如果可能的话,我试图将其保存在一个数据库中,因为有用户希望查看这两个组织),所以我不得不这样做 正如在播客中所讨论的,例如有一个人表。这很简单,因为如果我只是查询人表,

我有一个带有SQL server后端的asp.net-MVC网站。有100个不同的表格,这个网站为300人的组织工作

我们现在想将它用于另一个组织,然后出现了一个如何扩展站点的技术问题。以下是一些要求:

背景: 有许多表可以在两个组织中完全重用,但也有许多表需要添加过滤器,以确保只返回与特定组织相关的记录

考虑到这一点,我有or(如果可能的话,我试图将其保存在一个数据库中,因为有用户希望查看这两个组织),所以我不得不这样做

正如在播客中所讨论的,例如有一个表。这很简单,因为如果我只是查询表,那么只需在查询中添加一个“where Person.Org=“a”。但它也会影响任何与表直接或间接连接的查询。因此,假设我有一个Car表,并且有一个Owner列(这将是表中的外键),如果我有一个汽车下拉列表,我将首先加入,然后添加该过滤器(在它只是从汽车中选择*之前)。我使用的是nhibernate,但你明白了

问题: 我现在的重点是,我正在尝试确定如何在我的所有asp.net-mvc控制器操作周围增加一个开关,以支持这个新组织。因此,如果我有40个控制器,每个控制器有10个操作,我必须更新400个操作和每个页面(所有的视图和javascript代码都指向特定的URL。我必须首先确定我所处的“模式”,以确定我应该查询Org1还是Org2

我不想通过每一个控制器操作来添加一个新的参数或一个路径,即“Org Name”或类似的东西,所以我想看看是否有任何想法。即使它运行两个不同的网站,如果我想在一个代码库中运行,我仍然需要有这个全局开关


是否有建议可以避免在每个控制器操作中添加额外的参数?

是否会在路由帮助中添加
客户ID/名称
?我在一个类似的应用程序上工作,我的路由模式如下所示:

{customer}/{controller}/{action}/{id}
因为您已经有了代码库,所以可以将客户添加为可选参数:

{controller}/{action}/{id}/{customer}

...
customer = UrlParameter.Optional
无论哪种方式,您都需要在Url操作中提供路由值。 在我的例子中,所有控制器都继承自一个基本控制器,该控制器通过自定义属性或代码识别客户,检查安全性、授权等。基本控制器设置一个名为
CurrentCustomer
的受保护属性,该属性包含所需的所有信息。 它工作得很好,因为客户用户或管理员用户可以访问相同的界面。管理员用户可以访问多个客户的信息,应用程序可以使用多个数据库(一个数据库可以包含多个客户)


我认为,对于您来说,最好为每个客户提供单独的数据库,以避免将客户id传递给SQL语句/SP(并进行大量代码更改)。您只需要在运行时根据客户确定要使用哪个数据库。

假设您有一组有限的表(至少,包含控制器操作的表更少)而且您的CRUD操作是集中的,您可以在用户登录时在会话中设置orgId,并使用该值对所有查询进行筛选?

但是您的建议要求我进入每个操作,并使用附加参数和每个客户端ajax调用更新它,并更改以添加附加参数希望知道是否有办法避免这种情况不,您不必将此参数添加到每个操作中,因为它是可选的。基本控制器将在其
初始化
方法中使用此参数:
string customerName=this.RouteData.Values[“customer”].ToString()
我想了一下,我想知道用户登录时是否能识别出他们属于哪个组织(要求他们输入组织名称不太好)。如果是这样,请让帐户管理员设置当前组织并将其用于数据访问。这样,您根本不需要更改路由。您需要将此信息存储在会话、cookie等中,以避免将其传递给每个控制器操作。在我的情况下,存储状态是完全禁止的,因为负载平衡或安全性如果我有不同的URL(abc.mysite.com或def.mysite.com可以区分)我认为它会起作用。你只需要获取子域名,它可能是组织名称,并将其用作数据访问的开关。这可能会对你有所帮助。但它从何处获取orgId?假设我在我的site.master上有一个Orgs下拉列表。我如何将其传递给所有控制器?处理数据的控制器操作组织选择可以继续在会话中设置组织ID。也许,在实例化存储库时,您可以根据路由中的一些新可选客户端参数动态激活一些NH查询筛选器。我不知道它是否有效,但这将导致对代码的最小更改。不过,这只是随机想法。