我一直在使用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属性?
答案 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" }))
{
//...
}