相关链接和 URL 在 ASP.NET MVC 中重写

Relative links and URL rewrite in ASP.NET MVC

我有一个被不同公司使用的 ASP.NET MVC 应用程序。应用程序的 URL 看起来像这样:http://myapp.com/companyA/stuffhttp://myapp.com/companyB/stuff。我从 Application_BeginRequest 中的 URL 获取公司标识符,然后执行 RewritePathhttp://myapp.com/stuff

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

的 link

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

谢谢。

问题是您正在使用URL重写。 URL 重写是 one-way 映射 - URL 到资源。

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

MVC 中的路由非常灵活。 MapRoute 扩展方法可用于创建相当多的选项。但是,您可以通过继承 Route class 或 RouteBase class 从字面上创建您想要的任何 URL 方案。您可以从字面上使用请求中的任何内容(URL、headers、cookie、session 状态等)来路由到资源(通常是控制器操作)。有关高级示例,请参阅 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 to separate each company. Also see the MSDN tutorial。每个区域都有自己的路线,它们就像 MVC 应用程序中的不同容器。

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