Подтвердить что ты не робот

Использование Html.BeginForm с querystring

Мой url выглядит так:

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

Но не знаю, как добавить querystring, который должен быть в html:

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

Я думал об использовании <form> напрямую, но не знаю, как указать переменную querystring. И я понятия не имею, как добиться этого с помощью Html.BeginForm. Любой совет будет оценен.

Решение:

В настоящее время я использовал <form> со следующей подсказкой Как получить текущее значение URL в представлении. Полученный вид выглядит как

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

Но было бы неплохо иметь перегруженный метод BeginForm для этого.

4b9b3361

Ответ 1

Я предполагаю, что это прямо не отвечает на вопрос, но почему бы просто не использовать простой тег старой формы?

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

В качестве альтернативы вы можете создать пользовательский HtmlHelperExtension, который отображает форму с указанием пути и запроса. В этом HtmlHelperExtension вы можете перебирать значения ваших запросов и заполнять routeValueDictionary, которые затем передаются в конструктор Html.BeginForm.

Если вы не хотите что-то настолько расширяемое, вы можете просто использовать перегруженный конструктор Html.BeginForm, используя @Html.BeginForm("login", "customer", new {ReturnUrl = @Request.QueryString["ReturnUrl"]},FormMethod.Post, new {data-id="something"});

Ответ 2

Чтобы создать RouteValueDictionary из строки запроса:

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

Ответ 3

Вот способ, который работал у меня

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

Это было похоже на проблему с перегрузкой метода, но, указав, что это такое, кажется, что это нормально...

Ответ 4

используя Reflector для просмотра кода,

BeginForm() передает непосредственно rawUrl в конечную форму. Любые другие перегрузки на BeginForm будут проходить через вспомогательную утилиту, которая будет лишать строку запроса.

Ответ 5

Попробуйте @using(Html.BeginForm(null, null, FormMethod.Post, new { data_id="something" }))

Он должен использовать логику по умолчанию для построения URL-адреса, как если бы вы использовали BeginForm()

(никогда не пытался, хотя в таком случае, но я считаю, что он должен работать)

Ответ 6

Это работает для меня:

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

Явные значения и метод маршрута - это то, что требуется...

Ответ 7

Просто вы можете добавить другие атрибуты. используйте ниже код

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