2016-10-13 14 views
0

現在のクエリ文字列を送信しようとしています。だから私は、以下の拡張メソッド作成しました:MVC 5 AJax.Beginformルート値が正しく生成されていません

public static RouteValueDictionary ToRouteValues(this NameValueCollection col, Object obj = null) 
     { 
      var values = obj != null ? new RouteValueDictionary(obj) : new RouteValueDictionary(); 
      if (col == null) return values; 
      foreach (string key in col) 
      { 
       //values passed in object are already in collection 
       if (!values.ContainsKey(key)) values[key] = col[key]; 
      } 
      return values; 
     } 

をそして、私の見解では、私は以下のようにroutvaluesを使用しています:

using (Ajax.BeginForm(actionName: "Post", routeValues:Request.QueryString.ToRouteValues(), controllerName: "Request", ajaxOptions: new AjaxOptions { HttpMethod = "Post", OnSuccess = "SuccessCallBack", UpdateTargetId = "successDiv", InsertionMode = InsertionMode.InsertAfter }, htmlAttributes: new { @data_toggle = "validator" })) 
     { 
     } 

しかし、不思議なHTMLマークアップが発生したときに、フォームタグのアクションはありません。実際のクエリ文字列の値は代わりにオブジェクトメタデータの文字列バージョンを持ちます。

<form action="/Request/Post?Count=5&amp;Keys=System.Collections.Generic.Dictionary%602%2BKeyCollection%5BSystem.String%2CSystem.Object%5D&amp;Values=System.Collections.Generic.Dictionary%602%2BValueCollection%5BSystem.String%2CSystem.Object%5D" data-ajax="true" data-ajax-method="Post" data-ajax-mode="after" data-ajax-success="SuccessCallBack" data-ajax-update="#successDiv" data-toggle="validator" id="form0" method="post" novalidate="true"> 
+0

はソースとしてこのポストを使用します。 –

+0

私は、アクションもコントローラをその方法を試してみました、routevaluesなども同じ結果 – Unnie

答えて

2

を使用することによってこの問題を解決することができます

(何も行動を文書を見つけることが、まだ持っている)object routeValuesと、過負荷が最初に定義されているため、それだと仮定しています:

@using (Ajax.BeginForm(
    actionName: "AddOns", 
    controllerName: "Basket", 
    routeValues: Request.QueryString.ToRouteValues(), 
    ajaxOptions: new AjaxOptions { HttpMethod = "Post", OnSuccess = "SuccessCallBack", UpdateTargetId = "successDiv", InsertionMode = InsertionMode.InsertAfter }, 
    htmlAttributes: new Dictionary<string, object> { { "class", "mainForm" } })) 
{ 
    @:Blah 
} 

それは出力:

<form action="/Basket/AddOns?test=test" class="mainForm" data-ajax="true" data-ajax-method="Post" data-ajax-mode="after" data-ajax-success="SuccessCallBack" data-ajax-update="#successDiv" id="form0" method="post"> 
    Blah 
</form> 

リットルに注意してください。 astパラメータはDictionary<string, object>です。私は `Ajax.BeginForm`でコントローラ名はアクション名の後に来るべきで、その後、第三paramは、ルート値であることができると思いMVC3 Html.BeginForm - passing arguments as RouteValueDictionary fails

+0

完璧です。 – Unnie

1

問題は、あなたが名前付きパラメータを使用してobject routeValuesRouteValueDictionary routeValuesの両方を受け入れるAjax.BeginForm()のオーバーロードがあるということです。あなたのケースで

それはobject routeValuesを使用して、あなたはRouteValueDictionaryCountKeys、等)の各プロパティのルート値を生成します。私は、あなたが名前を省略し、これが私の作品

@using (Ajax.BeginForm("Post", "Request", Request.QueryString.ToRouteValues(), new AjaxOptions { HttpMethod = "Post", OnSuccess = "SuccessCallBack", UpdateTargetId = "successDiv", InsertionMode = InsertionMode.InsertAfter }, new { @data_toggle = "validator" })) 
{ 
} 
+0

は私のために – Unnie

+0

作品という名前のパラメータを削除することによって、これを試してみましたが、それでも同じ問題:) –

+0

それは、このコードの外の何でもかまいません。私は以前これが私のために働いていたことを覚えています。突然それは動作を停止しました。 – Unnie

関連する問題