Сохранение RouteData в Html.BeginForm()

Я использовал вариант метода Html.BeginForm(), чтобы прикрепить атрибут html к моей форме, например:

@using (Html.BeginForm("actionname", "controllername", FormMethod.Post, new { id = "myform" }))

К сожалению, это приводит к тому, что цель формы теряет все данные маршрута.

Скажи, мой URL был controller/action?abc=123затем с помощью Html.BeginForm() генерирует форму пост цели как controller/action?abc=123 но перегруженная версия (которую я использую для добавления атрибута html id в форму) генерирует цель как controller/action (что на самом деле понятно, так как я сам определяю маршрут, но это не решает мою задачу).

Есть ли вариант Html.BeginForm() что позволило бы мне сохранить старые значения маршрута и одновременно добавить атрибуты html в форму?

1 ответ

Решение

Насколько я вижу, только версия без параметров BeginForm использует текущий полный URL.

public static MvcForm BeginForm(this HtmlHelper htmlHelper) {
    // generates <form action="{current url}" method="post">...</form>
    string formAction = htmlHelper.ViewContext.HttpContext.Request.RawUrl;
    return FormHelper(htmlHelper, formAction, FormMethod.Post, new RouteValueDictionary());
}

Я не уверен, что это лучший способ, но вы можете написать специальный помощник для формы, чтобы включить QueryString ценности:

public static class MyFormExtensions
{
    public static MvcForm MyBeginForm(this HtmlHelper htmlHelper, object htmlAttributes)
    {
        var rvd = new RouteValueDictionary(htmlHelper.ViewContext.RouteData.Values);
        var queryString = htmlHelper.ViewContext.HttpContext.Request.QueryString;
        foreach (string key in queryString.AllKeys) rvd.Add(key, queryString[key]);
        return htmlHelper.BeginForm(null, null, rvd, FormMethod.Post, HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes));
    }
}

@using (Html.MyBeginForm(new { id = "myform" }))
{
    //...
}
Другие вопросы по тегам