Html.BeginForm() with only form Id is not generating correct action url

Amit picture Amit · Nov 26, 2013 · Viewed 12.4k times · Source

I only want to add the formId in the beginForm()

If i try using
Html.BeginForm(null, null, FormMethod.Post, new {@id="Id"})

then the Html generated is
<form action="/newquestion/payment/b9f88f80-f31f-4144-9066-55384c9f1cfc" ... >

i don't know how that action url is generated so i tried,
Html.BeginForm(new {@id="Id"})
but then the action url looks like this
<form action="/newquestion/payment/Id... >

In both the cases the action url is not what it should be and it is not hitting the post action of the controller.

Answer

Rowan Freeman picture Rowan Freeman · Nov 26, 2013

When you are trying to generate a route, such as with BeginForm, MVC will do its best to include things that you might need.

If you're at domain.com/Home/Index/b9f88f80-f31f-4144-9066-55384c9f1cfc and you use the code that you have provided than the form will be generated with the action, controller and route values as it finds them.

controller / action / id
/Home      / Index  / b9f88f80-f31f-4144-9066-55384c9f1cfc

One way to get around this is to force id to be nothing (such as an empty string).

Observe:

@using (Html.BeginForm(null, null, new { @id = string.Empty },
    FormMethod.Post, new { @id = "Id" }))
{

}

The new { @id = string.Empty } is an anonymous object that represents the route values.