2013-02-04 71 views
0

我想了解我的RouteConfig安裝程序中的行爲。以下是我有:ASP.NET URL重寫Html.BeginForm控制器

public class RouteConfig 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      name: "2KeywordController", 
      url: "{keyword1}-{keyword2}-{controller}/{action}", 
      defaults: new { action = "Index" } 
     ); 

     routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}", 
      defaults: new { controller = "Home", action = "Index" } 
     ); 
    } 
} 

我有一個名爲的ContactController控制器和/Views/Contact/Index.cshtml下一種觀點認爲,有以下創建窗體:

@using (Html.BeginForm("Index", "contact", FormMethod.Post, new { id = "contactform" })) 

,當我瀏覽以example.com/kw1-kw2-contact正確調用ContactController並顯示默認聯繫人視圖。當我看到源代碼時,我驚訝地發現表單的動作被設置爲「/ kw1-kw2-contact」而不是「/ contact」。有沒有辦法使用Html.Begin(),但只有控制器名稱出現在沒有兩個關鍵字的行動?例如/聯繫

回答

3

有沒有辦法使用Html.Begin(),但只有控制器名稱 出現在沒有兩個關鍵字的行動?

當然,你可以使用一個BeginRouteForm代替BeginForm,並指定要使用的路線名稱:

@using (Html.BeginRouteForm(
    routeName: "Default", 
    routeValues: new { action = "index", controller = "contact" }, 
    method: FormMethod.Post, 
    htmlAttributes: new { id = "contactform" }) 
) 
{ 
    ... 
} 

會發出:

<form action="/contact" id="contactform" method="post"> 
    ... 
</form> 
+0

所以BeginForm將使用最後的路線並且BeginRouteForm允許你定義動作?謝謝。 – Josh

+0

@Josh,恰到好處。實際上很小的修正:'BeginForm'將使用匹配請求的**第一條**路線。路線按您定義的順序進行評估。通過'BeginRouteForm',你可以明確地指定你想用他的名字使用的路線。 –