ASP.NET MVC中的相对链接和URL重写

时间:2015-09-21 17:04:40

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

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

我的问题是关于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

感谢。

1 个答案:

答案 0 :(得分:1)

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

现代(以及更多以MVC为中心)的做事方式是使用.NET路由。路由是从URL到资源以及从资源到URL的双向映射。资源由(最好是唯一的)路由值集标识。

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处理方式。