Using Html.BeginForm with querystring

My url looks like this:

customer/login?ReturnUrl=home

In the login view, I have used this pattern of code which works fine.

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

This magically generates following html

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

But now, I need to add an attribute (e.g., data-id="something") in the form. How can I do that? If I don't have any query string, I know I can do something like this:

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

But don't know how to add querystring which should be in html:

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

I thought about using <form> directly but don't know how to specify querystring which is variable. And I have no idea how to achieve it with Html.BeginForm. Any tip would be appreciated.

RESOLUTION:

For now, I used <form> with following hint How to get current url value in View. The resulting view looks like

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

But it would be nice to have an overloaded method of BeginForm for this.

Answers


I guess this doesn't directly answer the question, but why not just use a plain old form tag?

 <form action='customer/login?ReturnUrl=@Request.QueryString["ReturnUrl"]' method="post" data-id="something">

Alternatively, you can create a custom HtmlHelperExtension that renders a form with path and querystring. In this HtmlHelperExtension you can iterate through your querystring values and populate the routeValueDictionary which you then pass to a Html.BeginForm constructor.

If you don't want something so extensible you can just use the overloaded constructor of Html.BeginForm using @Html.BeginForm("login", "customer", new {ReturnUrl = @Request.QueryString["ReturnUrl"]},FormMethod.Post, new {data-id="something"});


To create a RouteValueDictionary from the querystring:

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

Then you can use it with Html.BeginForm:

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

Here's The way that worked for me

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

It was almost like there was a problem with overloading the method, but by specifying what things are, it seems to work fine...


using Reflector to look at the code,

BeginForm() will pass directly the rawUrl over to the final Form. Any other overloads on BeginForm will go through a helper utility which will strip the query string.


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

It should use the default logic to construct the url, just as if you used BeginForm()

(never tried that though in such case, but I believe it should work)


This works for me :

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

Explicit route values and method is what is required...


Just incase you wanted to add other attributes as well. use below code

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

Need Your Help

Is there a way to get a <button> element to link to a location without wrapping it in an <a href ... tag?

javascript html button hyperlink

Just wondering if there is a way to get a HTML &lt;button&gt; element to link to a location without wrapping it in an &lt;a href... tag?

How to pass a session variable from one object to another in Gatling?

scala performance-testing gatling

I'm extracting session variable in ObjectA and would like to pass it to ObjectB, what is the best way to achieve this?