2012-03-27 34 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