2010-03-17 19 views
10

Avec ASP.net MVC est-il possible de POST un formulaire à une action du contrôleur qui inclut des paramètres non dans le formulaire, mais à partir de l'URL?ASP.NET MVC - Méthode d'action POST avec des paramètres supplémentaires à partir de l'URL

Par exemple

La méthode d'action en GroupController:

[AcceptVerbs(HttpVerbs.Post)] 
    public ActionResult Create(int idOne, int idTwo, Model model) 
    { ... } 

L'itinéraire:

"{controller}/{action}/{idOne}/{idTwo}" 

URL Posté:

/Employee/Show/1/42 

Dans cet exemple, la forme est être posté à un contrôleur différent, le modèle a la valeur correcte, mais les autres paramètres ont des valeurs par défaut 0.

Le comportement que je m'attendais à ce que le ModelBinder verrait que j'ai deux paramètres qui correspondent à l'itinéraire donné, et assigner le courant valeurs de 1 et 42 aux paramètres de la même manière qu'une opération GET fonctionne.

Ce comportement n'est-il pas pris en charge ou manque-t-il quelque chose?

EDIT: Pour être clair, la forme de la vue Show pour le contrôleur Employee contient une forme qui est l'affichage à un autre contrôleur. Nous pouvons l'appeler Group.

L'URL d'action de la forme ressemble à ceci

/Groups/Create/0/0 

La forme est déclarée comme suit

Html.BeginForm("Create", "Groups") 

Après avoir essayé plusieurs surcharges différentes pour Html.BeginForm j'ai trouvé que les paramètres ne sont mis en correspondance lorsque le formulaire l'URL de l'action correspond à l'URL actuelle dans la barre d'adresse du navigateur. Donc, si je me rends à l'adresse URL /Groups/Create/1/42, je vais avoir un nouveau formulaire. Si je soumets ensuite le formulaire, les valeurs d'itinéraire URL sont passées à l'action POST.

+2

Je voudrais essayer de définir la route pour le modèle et la définir comme défaut de null et de voir ce qui se passe. '{controller}/{action}/{idOne}/{idTwo}/{Modèle}' –

Répondre

8

Si je comprends bien votre question, vous voulez que le action de l'élément <form> rendu pointant vers l'URL contenant des valeurs de route. Cela devrait être possible avec l'une des surcharges de la méthode d'extension HtmlHelper.BeginForm():

Html.BeginForm("action","controller", new { idOne=1, idTwo=2 }, FormMethod.Post); 

Laissez-moi savoir si je suis votre question tout faux :)

+0

Sorte de. Comme je l'ai indiqué dans la question, l'action for contient déjà une URL avec les valeurs de route correctes (1 et 42 de l'exemple). Le problème est que quand j'entre dans l'action d'exécution, les deux paramètres ont la valeur 0. J'ai essayé votre suggestion, mais les valeurs étaient toujours 0. – Karl

2

Je suis assez sûr que vous ne pouvez pas poster des données sous forme des entrées à l'intérieur du formulaire. Avez-vous envisagé de rendre la vue de manière à créer des valeurs d'entrée de formulaire hors de l'URL (peut-être avec une aide HTML?).

MISE À JOUR: Si vous ne souhaitez pas utiliser le formulaire, utilisez ControllerContext.RouteData.Values["idOne"] plutôt que de le transmettre via la signature de méthode.

+0

Dans le formulaire j'ai fait une requête aux valeurs de route, ViewContext.RouteData.Values ​​[" idOne "], mais sur la page de rendu finale a une valeur de 0, pas la valeur de la route. Existe-t-il une autre approche pour obtenir les valeurs d'itinéraire d'URL actuelles à partir d'une vue/partielle? – Karl

+0

Si vous utilisez une extension d'assistance Html, vous devriez pouvoir la voir hors de l'instance d'assistance elle-même. La syntaxe ressemblerait à 'helper.ViewContext.RouteData.Values ​​[" idOne "]'. Alternativement, vous pouvez stocker ces valeurs d'ID dans un modèle de vue et le transmettre à la vue de cette façon. –

+0

+1 Mêmes pensées. Pourquoi ne pas l'inclure dans les valeurs comme champs cachés dans le Html.BeginForm ("Créer", "Groupes")? En outre, devriez-vous «publier» pour créer un nouveau formulaire? – Ahmad

0

J'ai eu récemment cette question aussi, et parce que j'avais une autre route, il a été cartographie à la route par défaut, sans tenir compte de la params route supplémentaire que je passais.

Donc, pour le faire fonctionner rapidement, j'ai écrit le formulaire en utilisant des balises de formulaire et j'ai utilisé @ Url.Action pour créer l'action requise.

0

Une fois que vous arrivez à votre vue Créer, les valeurs de route utilisées pour y accéder doivent être réaffichées dans l'action de publication. Donc, une option consiste à avoir une paire de hiddens, pour contenir les identifiants qui proviennent de l'itiné- raire. De cette façon, une fois que vous postez les formulaires, ses valeurs sont affichées avec les autres entrées.

0

J'ai eu un problème similaire, la configuration RouteConfig a résolu ce problème.

public class RouteConfig 
    { 
     public static void RegisterRoutes(RouteCollection routes) 
     { 
      ... 
      routes.MapRoute(
      "MyRoute", 
      "{controller}/{action}/{idOne}/{idTwo}", 
      new 
      { 
       controller = "Employee", // as an example 
       action = "Show", 
       idOne = UrlParameter.Optional, 
       idTwo= UrlParameter.Optional 
      }, new { idOne = @"\d{1,5}" }); 

     } 
    } 

... Et ... Html.BeginRouteForm()

@using (Html.BeginRouteForm("MyRoute", new { idOne = 1, idTwo= 2 }, FormMethod.Post)) 

écrit une balise d'ouverture à la réponse. Lorsque l'utilisateur soumet le formulaire , la demande est traitée par la cible de l'itinéraire. Ce membre est surchargé. Pour obtenir des informations complètes sur ce membre, , y compris la syntaxe, l'utilisation et les exemples, cliquez sur un nom dans la liste de surcharge .

Et tous les travaux