2009-11-18 124 views
3

使用MVC,我有我的觀點HTML表單幫手:ASP.Net MVC路由問題與Html.BeginForm

using (Html.BeginForm("ActionOne", "ControllerOne")) ... 

使用默認路由,輸出爲action屬性爲預期:

<form action="/ControllerOne/ActionOne" ... 

但註冊看似沒有匹配的新路線會影響輸出。

路由代碼:

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

    routes.Add("testRoute", new Route("MyUrl", new MvcRouteHandler())); 

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

輸出:

<form action="/MyUrl?action=ActionOne&amp;controller=ControllerOne" 

這是通過設計還是我mising一些基本的東西?

乾杯!

回答

9

我曾經歷過這個確切的問題之前添加此。我不確定爲什麼System.Web.Mvc.HtmlHelper似乎只是使用routetable中的第一個非忽略路由來生成鏈接等,但我找到了一個解決方法,「BeginForm」問題。

如果命名的Global.asax.cs中的「默認」的路線,例如:

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

然後你可以使用Html.BeginFormRoute方法和所謂的「默認」 MVC的名字路線,然後將其命名控制器和動作具體地說,產生正確的URL:

using (Html.BeginRouteForm("Default", new { controller="YourController", action = "YourFormAction" })) { } 

HTH

+0

嘿,那有效。它仍然非常理想,因爲在全球範圍內更改路由將需要您編輯每個匹配項( – theGecko 2009-11-18 10:02:07

+0

)我同意它不是理想的,可能需要一些工作才能更新BeginForm的所有用法 - > BeginRouteForm(如果已完成)在一個現有的webapp上,但是如果你將所有表單設置爲使用默認路由(如上所述),那麼只要你保持該路由完好無損,對路由的任何其他更改不會影響表單,因此它是一個強大的解決方案。 – 2009-11-18 10:18:04

1

試試這個

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

     routes.Add("testRoute", new Route("MyUrl/***{action}/{controller}***", new MvcRouteHandler())); 

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

我認爲它應該解決您的問題。

+0

此輸出: <形式行動= 「/ MyUrl/*** ActionOne/ControllerOne ***」 – theGecko 2009-11-18 09:58:53

+0

對不起,***部分是粗體和斜體,但它沒有顯示。我的意思是MyUrl/{action}/{controller} – 2009-11-18 10:49:45

-1

默認路由

 routes.MapRoute("", "ControllerOne/ActionOne", new { controller = "ControllerOne", action = "ActionOneOne"}); 
+0

我們是否需要註冊每個可能的控制器/操作對? – theGecko 2009-11-18 09:57:04