32

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.

4
  • where are you wanting to add the attribute, to the Form or something in the Form? Commented Sep 6, 2011 at 17:04
  • Are you looking to add another form value or to dynamically set the query string? Commented Sep 6, 2011 at 17:06
  • @msarchet and Tejs I want the attribute on form element. Commented Sep 6, 2011 at 17:10
  • [This][1] will surely help to solve with BeginForm [1]: stackoverflow.com/questions/3076656/… Commented Feb 22, 2012 at 15:15

7 Answers 7

23

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...

Sign up to request clarification or add additional context in comments.

2 Comments

Adding the query string parameters in the routeValues dictionary works for me.
what if I want to add class to the form as well, @using (Html.BeginForm("actionName", "controllerName", routeValues: new { lang = "en" }, method:FormMethod.Post, htmlAttributes: new { @class= "my-form", enctype = "multipart/form-data" }))
17

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

 <form action='customer/[email protected]["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"});

3 Comments

i just noticed you edited your question with the first idea as well.
But if I add another querystring, I have to change the code again. I got a better answer, please see the last part of my updated answer. Thanks for your answer.
You're welcome. I've updated my answer as well using a constructor of BeginForm itself.
17

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" } })

Comments

3

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.

Comments

1

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" }))

Comments

0

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...

Comments

-1

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)

2 Comments

I tried that already but resulting form has action="/customer/login". It should be /customer/login?ReturnUrl=home
Unfortunately, it does not preserve the query string when passing null to the action and controller parameters.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.