2016-10-13 1 views
0

Je suis en train d'envoyer à l'action la chaîne de requête actuelle. J'ai donc créé la méthode d'extension ci-dessous:MVC 5 AJax.Beginform Les valeurs de route sont générées à tort

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; 
     } 

Et à mon avis, je suis en utilisant les routvalues ​​comme ci-dessous:

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" })) 
     { 
     } 

Mais étrangement lorsque le balisage HTML est généré l'action de balise form ne pas les valeurs de chaîne de requête réelles, mais à la place une version de chaîne des métadonnées de l'objet.

<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

Je pense que dans 'Ajax.BeginForm' le nom du contrôleur doit venir après le nom d'action, puis, le troisième peut être param les valeurs de l'itinéraire. –

+0

J'ai essayé de cette façon également action, contrôleur, routevalues ​​etc toujours le même résultat – Unnie

Répondre

2

Cela fonctionne pour moi:

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

Il produit:

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

S'il vous plaît noter la l Paramètre ast qui est Dictionary<string, object>.

a utilisé ce poste source: MVC3 Html.BeginForm - passing arguments as RouteValueDictionary fails

+0

Parfait, ça a marché. – Unnie

1

Le problème est que votre aide des paramètres nommés et il y a des surcharges de Ajax.BeginForm() qui acceptent à la fois object routeValues et RouteValueDictionary routeValues.

Dans le cas de son en utilisant object routeValues et votre générer une valeur de trajet pour chaque propriété de RouteValueDictionary (Count, Keys, etc). Je suppose que est parce que la surcharge avec object routeValues est défini en premier (mais doivent encore trouver quelque chose de documenter le comportement)

Vous pouvez résoudre ce problème en omettant les noms et en utilisant

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

essayé cela en supprimant les paramètres nommés, mais toujours le même numéro – Unnie

+0

Fonctionne pour moi :) –

+0

Pourrait-il être quelque chose en dehors de ce code. Comme si je me souviens que ça fonctionnait pour moi avant. Tout à coup, il a cessé de fonctionner. – Unnie