【问题标题】:Relative links and URL rewrite in ASP.NET MVCASP.NET MVC 中的相对链接和 URL 重写
【发布时间】:2015-12-18 11:37:16
【问题描述】:

我有一个被不同公司使用的 ASP.NET MVC 应用程序。应用程序的 URL 如下所示:http://myapp.com/companyA/stuffhttp://myapp.com/companyB/stuff。我从Application_BeginRequest 中的 URL 获取公司标识符,然后对http://myapp.com/stuff 执行RewritePath

我的问题是关于 ASP.NET MVC 生成的相对链接。这些链接似乎生成到站点的根目录,而忽略了 URL 中的公司标识符。例如,一旦在http://myapp.com/companyA/stuff@Url.Action("index", "home") 创建一个指向http://myapp.com/ not http://myapp.com/companyA/ 的链接

有没有办法指示 ASP.NET MVC 在生成相对链接时使用某个baseURL

谢谢。

【问题讨论】:

  • 当您使用 ASP.NET 的 URL 帮助程序时,您无法覆盖生成逻辑,因此您必须提供自己的等效项。
  • 我有一个类似的“多租户”应用程序,但我通过使用主机头(以及通配符主机头绑定和通配符 SSL 证书)而不是使用请求来区分公司 -路径组件。

标签: asp.net asp.net-mvc asp.net-mvc-4 asp.net-mvc-routing


【解决方案1】:

问题是您正在使用 URL 重写。 URL 重写是一种单向映射 - URL 到资源。

现代(以及更多以 MVC 为中心)的处理方式是使用 .NET 路由。路由是从 URL 到资源和从资源返回到 URL 的 2 向映射。资源由一组(最好是唯一的)路由值标识。

MVC 中的路由非常灵活。 MapRoute 扩展方法可用于创建相当多的选项。但是,您可以通过继承 Route 类或 RouteBase 类来创建您想要的任何 URL 方案。您可以从字面上使用请求中的任何内容(URL、标头、cookie、会话状态等)来路由到资源(通常是控制器操作)。有关高级示例,请参阅 this answer

但在您的情况下,您可以简单地设置一条路线以映射到正确的公司。

routes.MapRoute(
    name: "Company",
    url: "{company}/{action}",
    defaults: new { controller = "Company", action = "Index" },
    constraints: new { company = @"companyA|companyB" }
);

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

然后你只需要一个公司路由(每个公司的控制器是另一种选择,这取决于你想分享多少)。

public class CompanyController : Controller
{
    // CompanyA/
    // CompanyA/Index
    // CompanyB/
    // CompanyB/Index
    public ActionResult Index()
    {
        return View();
    }

    // CompanyA/Stuff
    // CompanyB/Stuff
    public ActionResult Stuff()
    {
        return View();
    }
}

然后在你的应用程序中,你需要在构建ActionLinks时指定公司,它将使用路由框架来构建URL。

@Url.ActionLink("Home", "Index", "Home", new { company = "companyA" }, null)
@Url.ActionLink("Home", "Index", "Home", new { company = "companyB" }, null)

对于这种情况可能更好的另一种选择是使用Areas 来分隔每个公司。另请参阅MSDN tutorial。每个区域都有自己的路由,它们就像 MVC 应用程序中的不同容器一样。

但无论哪种方式,您都应该真正摆脱 URL 重写,因为这是处理 URL 的过时方式。

【讨论】:

    猜你喜欢
    • 2011-08-24
    • 2011-12-22
    • 2023-03-15
    • 2010-09-10
    • 2013-02-06
    • 1970-01-01
    • 2013-08-28
    • 2015-06-08
    • 2018-10-11
    相关资源
    最近更新 更多