ASP.NET MVC Preview 4 - Arrêtez Url.RouteUrl() etc.en utilisant les paramètres existants

StackOverflow https://stackoverflow.com/questions/49194

  •  09-06-2019
  •  | 
  •  

Question

J'ai une action comme ceci:

public class News : System.Web.Mvc.Controller
{
    public ActionResult Archive(int year)
    {
       / *** /
    }
}

Avec un itinéraire comme celui-ci :

routes.MapRoute(
           "News-Archive",                                              
           "News.mvc/Archive/{year}",                           
           new { controller = "News", action = "Archive" }
       );

L'URL sur laquelle je me trouve est :

News.mvc/Archive/2008

J'ai un formulaire sur cette page comme celui-ci :

<form>
    <select name="year">
        <option value="2007">2007</option>
    </select>
</form>

La soumission du formulaire doit être effectuée sur News.mvc/Archive/2007 si « 2007 » est sélectionné dans le formulaire.

Cela nécessite que l'attribut « action » du formulaire soit « News.mvc/Archive ».

Cependant, si je déclare un formulaire comme celui-ci :

<form method="get" action="<%=Url.RouteUrl("News-Archive")%>">

il s'affiche comme suit :

<form method="get" action="/News.mvc/Archive/2008">

Quelqu'un peut-il me faire savoir ce qui me manque ?

Était-ce utile?

La solution

Vous avez quelques problèmes, je pense.

Premièrement, votre itinéraire n'a pas de valeur par défaut pour "année", donc l'URL "/News.mvc/Archive" n'est en fait pas valide à des fins de routage.

Deuxièmement, vous vous attendez à ce que les valeurs du formulaire s'affichent en tant que paramètres d'itinéraire, mais ce n'est pas ainsi que fonctionne HTML.Si vous utilisez un formulaire simple avec une sélection et une soumission, vos URL finiront par avoir "?year=2007" à la fin.C’est exactement ainsi que les formulaires de la méthode GET sont conçus pour fonctionner en HTML.

Vous devez donc parvenir à une conclusion sur ce qui est important.

  • Si vous souhaitez que l'utilisateur puisse sélectionner quelque chose dans la liste déroulante et que cela modifie l'URL de soumission, vous devrez alors utiliser Javascript pour y parvenir (en interceptant la soumission du formulaire et en formulant l'URL correcte).
  • Si vous acceptez /News.mvc/Archive?year=2007 comme URL, vous devez alors supprimer entièrement l'indicateur {year} de l'itinéraire.Vous pouvez toujours laisser le paramètre "int year" sur votre action, car les valeurs du formulaire rempliront également les paramètres de la méthode d'action.

Autres conseils

Je pense avoir compris pourquoi : l'itinéraire inclut {year}, donc les itinéraires générés le seront toujours également.

Si quelqu'un peut confirmer cela ?

Solution

D'accord, voici la solution (merci à Brad de m'avoir conduit là-bas).

1) Exiger la valeur par défaut dans l'itinéraire :

routes.MapRoute(
       "News-Archive",                                              
       "News.mvc/Archive/{year}",                           
       new { controller = "News", action = "Archive", year = 0 }
   );

2) Ajoutez une redirection pour analyser les paramètres GET comme s'il s'agissait de segments d'URL.

public ActionResult Archive(int year)
{
   if (!String.IsNullOrEmpty(Request["year"]))
   {
       return RedirectToAction("Archive", new { year = Request["year"] });
   }
}

3) Assurez-vous d'avoir votre code de redirection pour les paramètres de requête avant n'importe quel code pour rediriger les entrées d'année "par défaut".c'est à dire.

public ActionResult Archive(int year)
{
   if (!String.IsNullOrEmpty(Request["year"]))
   {
       return RedirectToAction("Archive", new { year = Request["year"] });
   }
   if (year == 0)
   {
       /* ... */
   }
   /* ... */
}

3) Spécifiez explicitement la valeur par défaut pour l'année dans l'appel Url.RouteUrl() :

Url.RouteUrl("News-Archive", new { year = 0 })
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top