簡體   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