2010-10-29 4 views
0

J'ai une application MVC2 avec un formulaire (comme vous le faites). L'utilisateur entre une requête dans le formulaire (dans la vue/Cars/Index) et frappe le bouton "soumettre" qui affiche l'action Détails de CarsController - la vue Détails rend avec des résultats, et tout va bien. L'utilisateur peut entrer une URL (telle que/Cars/Details/123-125) et la vue Détails s'affiche avec 123, 124 et 125, comme si vous l'aviez saisie sur le formulaire. Aussi bien et bien. Ce que je veux activer, si possible, est que lorsque l'utilisateur entre "123-125" ou quelque chose dans le formulaire, l'URL reflète également les résultats - au lieu de "/ Cars/Details" pour une URL, qui est ce qui montre maintenant, je veux qu'il montre "/ Cars/Details/123-125".mvc2 - obtenir l'URL pour refléter la soumission du formulaire

Pour la vie de moi, je ne peux pas comprendre comment cela devrait être fait.

Toute aide est appréciée.

Répondre

0

Ok, voici la réponse que je suis venu avec:

En bref: Rediriger GET

Fondamentalement, j'écris une action avec [HttpPost] attribut redirige le formulaire de soumission vers une autre action avec l'attribut [HttpGet]. L'itinéraire fonctionne si vous envoyez le formulaire ou tapez manuellement l'URL.

[HttpPost] 
    public ActionResult Details(CarViewModel model, int? pageNbr) { 
    // simply takes the form POST and re-routes it as a GET to pretty up the URL 
    // (see second Details action) 
     int page = pageNbr ?? 0; 

     return RedirectToAction("Details", new { query = model.Query, pageNbr = page }); 
    } 

    [HttpGet] 
    public ActionResult Details(CarViewModel model, int pageNbr) 
    { 
     // various magic to create the view... 

     return View(avm); 
    } 

En bonus, ceci prend en compte le message "Êtes-vous sûr de vouloir renvoyer?" ennui quand quelqu'un actualise la page ou frappe le bouton RETOUR dans leur navigateur.

0

Changez votre formulaire en GET au lieu de POST (POST est la valeur par défaut), et cela devrait fonctionner.

<% using (Html.BeginForm("Action", "Controller", FormMethod.Get)) { %> 
+0

Eh bien, c'était un pas dans la bonne direction - mais l'URL ressemble maintenant à ceci, qui est proche mais pas tout à fait:/Cars/Details? Query = 123. Je cherche/Cars/Details/123 –

+1

Pour que l'URL ressemble à ce que vous voulez, vous pouvez ajouter une nouvelle Route pour ce cas. Êtes-vous familier avec l'ajout de routes? La spécification du chemin serait quelque chose comme '/ Cars/Details/{* Query}', puis définissez les valeurs par défaut Controller et Action, selon le cas. –

+0

J'ai édité ce qui précède et ajouté l'astérisque devant la requête; vous auriez besoin de cela pour être sûr que le tiret que vous avez suggéré pourrait être dans les valeurs ne provoque pas de confusion pour le routage et pense que vous avez deux paramètres distincts. –

0

Il semble qu'il ne trouve pas de définition de route correspondante pour/Cars/Details/123-125. Je pense que cela pourrait se produire à cause du fonctionnement du moteur de routage.

ASP.NET MVC Route Contraints with {ID}-{Slug} Format

+0

Je ne crois pas que ce soit le cas - si vous tapez/Cars/Details/123-125 dans la barre d'adresse et appuyez sur Entrée * cela fonctionne *. Si vous utilisez le formulaire, cela fonctionne aussi, mais il a juste/Cars/Details /. Si la route n'était pas là, ça ne marcherait pas du tout. –

+0

Hmmm ... dans votre formulaire, passez-vous le 123-125 dans RouteData? – dotariel

+0

ce que ScottSEA a dit; Son action de contrôleur fonctionne correctement, mais la valeur par défaut pour Forms est qu'ils vont soumettre via POST, mais il le souhaite via GET afin que les informations de requête se trouvent dans la chaîne de requête. Le routage a cependant une certaine implication ici, à cause de la façon dont il veut que l'URL résultante apparaisse.(voir les commentaires sur ma réponse) –

Questions connexes