在Html.BeginForm()中保留RouteData

时间:2012-03-27 08:17:41

标签: asp.net asp.net-mvc-3 razor html.beginform routedata

我一直在使用Html.BeginForm()方法的变体将html属性附加到我的表单,如下所示:

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

不幸的是,这会导致表单目标丢失所有路由数据。

说我的网址为controller/action?abc=123,然后使用Html.BeginForm()生成表单发布目标为controller/action?abc=123但是重载版本(我用来将html id属性添加到表单中) ,生成目标controller/action(这实际上是可以理解的,因为我自己指定路线,但它不能解决我的目的)。

是否有Html.BeginForm()的变体允许我保留旧的路由值并允许我同时向表单添加html属性?

1 个答案:

答案 0 :(得分:1)

据我所知,只有BeginForm的无参数版本使用当前的完整网址。

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" }))
{
    //...
}