2012-01-27 45 views
7

我有一個多步驟的設置過程,我想只在URL相關的時候將查詢字符串參數傳遞給URL。MVC3 Html.BeginForm - 傳遞參數作爲RouteValueDictionary失敗

http://localhost:6618/Account/Profile?wizard=true&cats=dogs

@using(Html.BeginForm())

偉大的工作。它產生了:<form action="/Account/Profile?setup=true&amp;cats=dogs" method="post">即它將任何原始查詢字符串參數傳遞給POST操作,然後在該控制器操作中,我可以通過添加RouteValues來選擇哪些相關的傳遞給我的下一步,或者需要添加一個RedirectToResult。

但是,我需要爲我的表單分配一個類用於樣式目的。

我嘗試:

@using(Html.BeginForm("Profile", "Account", args, FormMethod.Post, new { @class = "mainForm" }))

其產生:

<form action="/Account/Profile?Count=1&amp;Keys=System.Collections.Generic.Dictionary%602%2BKeyCollection%5BSystem.String%2CSystem.Object%5D&amp;Values=System.Collections.Generic.Dictionary%602%2BValueCollection%5BSystem.String%2CSystem.Object%5D" class="mainForm" method="post">

args是由過濾器產生的,並且是一個RouteValueDictionary)。規範http://msdn.microsoft.com/en-us/library/dd505151.aspx表示您可以使用System.Web.Routing.RouteValueDictionary傳遞參數。

我要的是<form action="/Account/Profile?setup=true&amp;cats=dogs" class="mainForm" method="post">

我要提到我寧願不要做類似傳入new {key = value}代替,因爲有相當多的邏輯來決定什麼,我會沿着下一步路過。

關於在這裏做什麼的任何建議?

我受到這個看似簡單的任務的阻礙,我肯定錯過了一些非常明顯的東西。

+0

也許在這個其他職位的答案可能有點幫助? http://stackoverflow.com/questions/1219223/asp-net-mvc-getting-html-beginform-to-remember-querystring-params-when-submi – summea 2012-01-27 03:46:49

回答

10

指定參數時,並且是RouteValueDictionary

這是關鍵點這裏。在這種情況下,要確保你使用的是BeginForm方法correct overload

@using(Html.BeginForm(
    "Profile", 
    "Account", 
    args, 
    FormMethod.Post, 
    new RouteValueDictionary(new { @class = "mainForm" }) 
)) 
{ 
    ... 
} 

注意最後一個參數?它必須是IDictionary<string, object>才能工作。

在你的例子中,它是this overload被拿起。但是由於您傳遞的是routeValues參數的RouteValueDictionary而不是匿名對象,因此會變得混亂。

因此,您應該既將routeValues也將htmlAttributes作爲字典或兩者都作爲匿名對象。

+0

@Darin季米特洛夫你可以檢查我的問題,有一些相似之處:http://stackoverflow.com/questions/12142356/send-an-object-as-a-parameter-to-post-action-in-asp-net -mvc3 – Saeid 2012-08-27 14:00:59

+0

你的解決方案適用於我的情況,但我不明白爲什麼在類變量之前使用@符號。任何人都可以解釋這裏發生了什麼?謝謝。 – northben 2013-01-27 22:09:55

+0

@northben,它的使用是因爲'class'是C#中的一個保留關鍵字。您可以在C#規範中閱​​讀更多關於它的信息:http://msdn.microsoft.com/en-us/library/aa664670.aspx – 2013-01-28 06:38:08

0

只是一個想法,但即使是多步驟的形式,你是不是想要選擇全部GET或POST?在上面的例子中,它看起來像使用POST與表單...但仍然嘗試使用GET。

爲什麼不直接使用隱藏POST值(使用HTML INPUT)?

否則,用戶可以更容易地更改值,對吧? (雖然,可能無法在該申請事項而這大多隻是回味無窮。)

0

讓你在使用此重載:

http://msdn.microsoft.com/en-us/library/dd460542.aspx

是否有可能使ARGS簡單具有鍵和值的對象?我認爲這可能會解決你的問題。

根據文檔:

的參數通過反射通過檢查對象的屬性檢索。此對象通常使用對象初始化程序語法創建。 - 這似乎是發生了什麼 - 它使用反射來獲取路由字典的屬性 - 屬性是鍵(字符串集合)和值(對象集合)

另一種選擇是不使用HTML幫助程序並手動創建表單標籤 - 雖然這樣做會挫敗具有HTML幫助程序的目的。

+0

我應該早在我的帖子中提到的 - 它需要一點確定我想要保留/清理/添加參數的邏輯。也許我應該追求一個自定義的HtmlHelper? – Erica 2012-01-27 02:53:51

+0

我不確定自定義的HtmlHelper在這裏購買了什麼 - 邏輯必須去某個地方。 – 2012-01-27 10:45:17

4

下面的工作。

@using (Html.BeginForm("Profile", "Account", new { id=122}, FormMethod.Post, new { @class = "mainForm" })) 

的路由值由對象創建初始化語法即新的{鍵=值}是由濾波器產生

+0

我應該提到我不希望直接使用對象初始化語法,即新{key = value},因爲它需要我的代碼中的一些邏輯來確定我想傳遞的內容。 – Erica 2012-01-27 02:48:21