2

我一直在使用 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 属性?

4

1 回答 1

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" }))
{
    //...
}
于 2012-03-27T11:31:52.883 回答