2010-03-17 25 views
10

使用ASP.net MVC可以將表單發佈到控制器操作,其中包括不是表單中的參數,而是來自URL?ASP.NET MVC - 帶有來自URL的其他參數的POST操作方法

例如

在GroupController操作方法:

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Create(int idOne, int idTwo, Model model) 
    { ... } 

路線:

"{controller}/{action}/{idOne}/{idTwo}" 

發佈網址:

/Employee/Show/1/42 

在這個例子中,形式是被張貼到一個不同的控制器,該模型具有正確的值,但其他參數具有默認值0.

我期待的行爲是ModelBinder會看到我有兩個參數匹配給定的路線,並分配當前參數的值和1和42的值與GET操作的工作方式相同。

此行爲不受支持,或者我錯過了什麼?

EDIT: 爲了清楚起見,在Show視圖用於控制器Employee的形式含有,其發佈到不同的控制器的形式。我們可以稱它爲Group

形式行動URL看起來像這樣

/Groups/Create/0/0 

的形式聲明如下

Html.BeginForm("Create", "Groups") 

嘗試許多不同的重載Html.BeginForm我發現,參數僅映射在表格後動作網址與瀏覽器地址欄中的當前網址相匹配。

所以,如果我導航到網址/Groups/Create/1/42我會有一個新的表格。如果我然後提交表單,則URL路由值將傳遞給POST操作。

+2

我會嘗試定義路線包括模型並將其設置爲空的默認看看會發生什麼。 '{控制器}/{動作}/{idOne}/{idTwo}/{型號}' – 2010-03-17 20:07:46

回答

8

如果我正確理解您的問題,您希望012xx渲染的<form>元素指向包含路由值的URL。這應該是可能與HtmlHelper.BeginForm()擴展方法的重載之一:

Html.BeginForm("action","controller", new { idOne=1, idTwo=2 }, FormMethod.Post); 

讓我知道,如果我得到你的問題都錯了:)

+0

。正如我在問題中所述,for操作已經包含一個具有正確路由值的URL(示例中的1和42)。問題是,當我進入執行操作,這兩個參數的值爲0.我嘗試了你的建議,但值仍然是0. – Karl 2010-03-17 22:52:57

2

我敢肯定,你只能發佈表單數據來自表單內的輸入。你有沒有考慮以這種方式渲染視圖,以便從URL中創建表單輸入值(可能是使用HTML助手?)。

更新:如果你不想使用表格,使用ControllerContext.RouteData.Values["idOne"]而不是通過方法簽名傳入。

+0

在表單中,我查詢了路由值,ViewContext.RouteData.Values [「 idOne「],但是最終呈現的頁面上的值爲0,而不是來自路由的值。是否有另一種方法從View/Partial中獲取當前URL路由值? – Karl 2010-03-18 14:48:46

+0

如果您使用Html幫助器擴展,您應該能夠從幫助器實例本身中看到它。語法看起來像'helper.ViewContext.RouteData.Values [「idOne」]'。或者,您可以將這些ID值存儲在視圖模型中,並以此方式將其傳遞給視圖。 – 2010-03-18 17:22:28

+0

+1同樣的想法。爲什麼不把它作爲隱藏字段包含在Html.BeginForm(「Create」,「Groups」)中?另外,如果您是「發佈」創建新表單? – Ahmad 2010-03-19 08:34:39

0

最近,我有這個問題太,因爲我有一個不同的路線,它映射到默認的路由,而沒有考慮到我是路過的額外路由PARAMS。

因此,要得到它的工作很快,我使用表單標籤來編寫表單,並使用@ Url.Action來創建所需的操作。

0

一旦你到達你的創建視圖,你用來到達那裏的路由值需要重新發布到發佈操作。

所以,一個選項是有一對隱藏,以保存來自該路線的ID。這樣,一旦您發佈了formas,其值就會與其他輸入一起發佈。

0

我有一個類似的問題,配置RouteConfig已經解決了這個問題。

public class RouteConfig 
    { 
     public static void RegisterRoutes(RouteCollection routes) 
     { 
      ... 
      routes.MapRoute(
      "MyRoute", 
      "{controller}/{action}/{idOne}/{idTwo}", 
      new 
      { 
       controller = "Employee", // as an example 
       action = "Show", 
       idOne = UrlParameter.Optional, 
       idTwo= UrlParameter.Optional 
      }, new { idOne = @"\d{1,5}" }); 

     } 
    } 

...和... Html.BeginRouteForm()

@using (Html.BeginRouteForm("MyRoute", new { idOne = 1, idTwo= 2 }, FormMethod.Post)) 

寫入一個開始標記響應。當用戶提交 表單時,請求將由路由目標處理。 此成員已超載。有關此成員的完整信息, 包括語法,用法和示例,請單擊過載 列表中的名稱。

而且所有工作

相關問題