繁体   English   中英

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

[英]Relative links and URL rewrite in ASP.NET MVC

我有一个由其他公司使用的ASP.NET MVC应用程序。 该应用程序的网址如下所示: http://myapp.com/companyA/stuff : http://myapp.com/companyA/stuffhttp://myapp.com/companyB/stuff 我从Application_BeginRequest的URL获取公司标识符,然后执行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

谢谢。

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

现代的(并且更以MVC为中心)的处理方式是使用.NET路由。 路由是从URL到资源以及从资源到URL的两向映射。 通过一组(最好是唯一的)路由值来标识资源。

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

但就您而言,您只需设置一条路线即可映射到正确的公司。

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教程 每个区域都有自己的路线,它们在MVC应用程序中的作用类似于不同的容器。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM