2016-10-13 6 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

Я думаю, что в 'Ajax.BeginForm' имя контроллера должно прийти после того, как имя действия, а затем, третьи пары могут быть значением маршрута. –

+0

Я пробовал этот путь также действие, контроллер, routevalues ​​и т. Д. Еще такой же результат – Unnie

ответ

2

Это работает для меня:

@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>.

Используется этот пост в качестве источника: MVC3 Html.BeginForm - passing arguments as RouteValueDictionary fails

+0

Отлично, он сработал. – Unnie

1

Вопрос заключается в том, что вы используете именованные параметры и есть перегруженные Ajax.BeginForm(), которые принимают как object routeValues и RouteValueDictionary routeValues.

В вашем случае его использование object routeValues и ваша генерация значения маршрута для каждого свойства RouteValueDictionary (Count, Keys и т.д.). Я предполагаю, что это потому, что перегрузка с object routeValues определяется первым (но до сих пор найти что-нибудь документирующую поведение)

Вы можете решить эту проблему, опуская имена и использование

@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