2015-11-24 159 views
1

我試圖從Html.ActionLink得到一個漂亮的URL,但我得到的是querystring版本。當我在瀏覽器的導航欄中輸入什麼值時,我定義了一個完美的路徑,並最終獲得視圖並觸發控制器操作,我想我會這樣做。Html.ActionLink行爲不如預期

我的路由定義:

routes.MapPageRoute(
    "WebFormDefault", 
    "", 
    "~/Login.aspx" 
    ); 

routes.MapRoute(
    "MvcDefault", 
    "{controller}/{action}/{id}", 
    new {controller = "Foo", action = "Index", id = UrlParameter.Optional} 
    ); 

我的助手呼籲標記:

<ul> 
    <li>@Html.ActionLink("Foo Link", "FooAction", "Foo")</li> 
</ul> 

實際結果:

<a href="/?action=FooAction&amp;controller=Foo">Foo Link</a> 

我的期望:

<a href="/Foo/FooAction">Foo Link</a> 

我曾嘗試在當前應用程序之外開始一個新項目,並看到預期結果。我已經手動添加MVC到項目中,因爲它最初是一個webforms應用程序。這是各種各樣的雜交,我不確定是否會造成問題。我使用nuget引入MVC程序集和依賴項,並根據VS中的輸出從「New Project ...」模板自己設置配置。我看到兩者之間沒有區別,就我的根名稱空間之外的配置而言,我可以使用我的先前存在的類型。但是,我不知道是否還有其他事情需要我去做。但令人困惑的是,因爲MVC已經在混合環境中行動,否則就像我期望的那樣。

+1

您是否嘗試過使用像Glimpse這樣的東西來調試路由,以確保您的路由按照您的預期映射? –

+0

我完全忘記了一瞥。我會看看它有什麼要說的。 – Bigsby

+0

我認爲你需要先審查下面的網址:http://stackoverflow.com/questions/22914859/mvc5-actionlink-pass-data-as-query-string –

回答

1

在webform路由之前添加mvc路由。希望這會起作用。

routes.MapRoute(
    "MvcDefault", 
    "{controller}/{action}/{id}", 
    new {controller = "Foo", action = "Index", id = UrlParameter.Optional} 
); 

routes.MapPageRoute(
    "WebFormDefault", 
    "", 
    "~/Login.aspx" 
); 
+0

我不知道爲什麼順序很重要,但它工作。我認爲MapRoute vs. MapPageRoute和對ActionLink定義控制器和動作的調用會看到適當的路線,但顯然不是。 – Bigsby

+0

在完全滿足的多條路線第一條路線的情況下將起作用。 – Azim

+0

我明白了。我認爲運行時會將「明顯的MVC路線」和「明顯的webform路線」分開。它看起來像是我應該成爲功能的其中一件事。 – Bigsby

0
//To get this : <a href="/Foo/FooActionMethodName">Foo Link Text</a> 

//Your action link should be 
<ul> 
    <li>@Html.ActionLink("Foo Link Text", "FooActionMethodName", "FooController")</li> 
</ul> 

//Your controller should be 
public class FooController 
{ 
publics ActionResult FooActionMethodName() 
{ 

    return View(); 
} 
}