2011-09-06 128 views
27

我的網址使用Html.BeginForm看起來是這樣的:與查詢字符串

customer/login?ReturnUrl=home 

在登錄觀點,我已經使用這個代碼模式,工作正常。

@using(Html.BeginForm()) 
{ 
    ... 
} 

這神奇生成下面的HTML

<form action="customer/login?ReturnUrl=home" method="post"> 

但是現在,我需要在形式添加屬性(例如,data-id="something")。我怎樣才能做到這一點?如果我沒有任何查詢字符串,我知道我可以做這樣的事情:

@using(Html.BeginForm(action, controller, FormMethod.Post, 
         new { data_id="something" })) 

但不知道如何添加查詢字符串應該是在HTML:

<form action="customer/login?ReturnUrl=home" method="post" data-id="something"> 

我想關於直接使用<form>,但不知道如何指定查詢字符串是可變的。我不知道如何通過Html.BeginForm來實現它。任何提示將不勝感激。

解決方案:

現在,我用<form>有如下提示How to get current url value in View。結果視圖看起來像

<form action="@Request.Url.PathAndQuery" data-id="something" method="POST"> 

但它會是不錯的BeginForm此重載方法。

+0

你要在哪裏添加屬性,窗體或窗體中的東西? – msarchet

+0

您是否希望添加其他表單值或動態設置查詢字符串? – Tejs

+0

@msarchet和Tejs我想要表單元素上的屬性。 –

回答

15

我想這不直接回答這個問題,但爲什麼不只是使用普通的舊形式標籤?

<form action='customer/[email protected]["ReturnUrl"]' method="post" data-id="something"> 

或者,您可以創建與渲染路徑和查詢字符串形式的自定義HtmlHelperExtension。在這個HtmlHelperExtension中,您可以遍歷查詢字符串值並填充您傳遞給Html.BeginForm構造函數的routeValueDictionary。

如果你不想要的東西,所以擴展性,你可以使用 @Html.BeginForm("login", "customer", new {ReturnUrl = @Request.QueryString["ReturnUrl"]},FormMethod.Post, new {data-id="something"});

+0

我剛剛注意到你用第一個想法編輯了你的問題。 – arviman

+0

但是,如果我添加另一個查詢字符串,我必須再次更改代碼。我得到了更好的答案,請參閱我更新後的答案的最後部分。感謝您的回答。 –

+0

不客氣。我已經使用BeginForm本身的構造函數更新了我的答案。 – arviman

0

嘗試@using(Html.BeginForm(null, null, FormMethod.Post, new { data_id="something" }))

應該使用默認的邏輯來構造URL,就像您使用BeginForm()

(從未嘗試過,雖然在這種情況下,但我相信它應該工作)

+1

我試過了,但是生成的表單有'action =「/ customer/login」'。它應該是'/ customer/login?ReturnUrl = home' –

+0

不幸的是,它在將null傳遞給動作和控制器參數時不保留查詢字符串。 – spikyjt

17

要從查詢字符串創建一個RouteValueDictionary只使用Html.BeginForm的重載的構造函數:

RouteValueDictionary queryStringDictionary = new RouteValueDictionary(Request.QueryString.AllKeys.ToDictionary(key => key, key => (object)Request.QueryString[key])); 

然後你可以使用它與Html。BeginForm:

Html.BeginForm(null, null, queryStringDictionary, FormMethod.Post, new Dictionary<string, object> { { "autocomplete", "off" } }) 
14

下面是爲我工作

Html.BeginForm("Profile", "Partner", routeValues: new {id=Partner.partner_id},method:FormMethod.Post) 

這幾乎就像有一個與重載方法的問題的方法,而是通過指定的東西是什麼,它似乎做工精細.. 。

+0

在routeValues字典中添加查詢字符串參數適用於我。 – munissor

+0

如果我想將類添加到表單中,@using(Html.BeginForm(「actionName」,「controllerName」,routeValues:new {lang =「en」},方法:FormMethod.Post,htmlAttributes:new { @ class =「my-form」,enctype =「multipart/form-data」})) –

2

使用反射來看看代碼,

BeginForm()將直接傳遞rawUrl轉移到最終形式。 BeginForm上的任何其他重載都將通過一個幫助程序實用程序來刪除查詢字符串。

0

這個工作對我來說:

@using (Html.BeginForm("index", "Photos", routeValues: new { user = pUser, album = pAlbum, }, method: FormMethod.Get)) 

顯式路由的價值觀和方法是需要什麼樣的...

0

只是櫃面你想添加其他屬性爲好。使用下面的代碼

@using (Html.BeginForm("actionName", "controllerName", routeValues: new { lang = "en" }, method:FormMethod.Post, htmlAttributes: new { @class= "my-form", enctype = "multipart/form-data" }))