2012-03-27 75 views
2

我一直使用Html.BeginForm()方法的变体,HTML属性附加到我的形式,像这样:在Html.BeginForm()保留的RouteData

@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

就我所见,只有无参数版本的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" })) 
{ 
    //... 
} 
+0

这似乎是一个很好的解决方案,并它应该工作,对吧?你为什么说“不知道这是否是最好的方式”?这种方式有什么问题? – 2012-03-28 03:24:19

+0

它应该工作正常。我的意思是,尽管这是我能想到如何去做的最好方式,但别人可能会有一个更简单的解决方案。 – pjumble 2012-03-28 07:17:59