Сохранение RouteData в Html.BeginForm () - PullRequest
2 голосов
/ 27 марта 2012

Я использовал вариант метода 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 в форму), генерируетtarget как controller/action (что на самом деле понятно, так как я сам указываю маршрут, но это не решает мою цель).

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

1 Ответ

1 голос
/ 27 марта 2012

Насколько я вижу, только версия без параметров 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" }))
{
    //...
}
...