web-dev-qa-db-fra.com

Utiliser des variables de chaîne de requête dans le contrôleur MVC

Je suis nouveau sur C # .net MVC et j'essaie d'ajouter FullCalendar à une application MVC. 

Le script FullCalendar ajoute automatiquement ?start={}&end={} à l'URL ... ce qui est correct, mais je ne sais pas comment utiliser les variables querystring dans un contrôleur.

Les méthodes que j'ai utilisées dans les applications Webforms ne fonctionnent pas. Que dois-je ajouter au contrôleur pour accéder aux variables querystring?

44
davids
public ActionResult SomeAction(string start, string end)

La structure mappera les paramètres de la chaîne de requête aux paramètres de la méthode. 

78
Maess

Je l'ai compris ... j'ai finalement trouvé un autre article dessus.

string start = Request.QueryString["start"];

string end = Request.QueryString["end"];
67
davids

Davids, j'ai eu exactement le même problème que toi. MVC n’est pas intuitif et il semble que lorsqu’ils l’ont conçu, les enfants n’ont pas compris le but ou l’importance d’un système de chaîne de requêtes intuitif pour MVC.

Les chaînes de chaînes de caractères ne sont pas définies dans les routes (RouteConfig). Ce sont des paramètres "extra" complémentaires aux actions dans le contrôleur. Cela est très déroutant, car les paramètres Action sont conçus pour traiter les deux chemins ET les chaînes de chaînes de caractères. Si vous avez ajouté des paramètres et qu'ils ne fonctionnaient pas, ajoutez-en un deuxième pour la chaîne de requête de la manière suivante:

Ce serait votre action dans votre classe de contrôleur qui attrape l'ID (qui est en fait juste un chemin défini dans votre fichier RouteConfig en tant que chemin par défaut typique dans MVC):

public ActionResult Hello(int id)

Mais pour attraper les chaînes de requête, un paramètre supplémentaire dans votre contrôleur doit être ajouté (ce qui n'est PAS défini dans votre fichier RouteConfig, soit dit en passant):

public ActionResult Hello(int id, string start, string end)

Ceci écoute maintenant "/ Hello? Start = & end =" ou "/ Hello /? Start = & end =" ou "/ Hello/45? Start = & end =" en supposant que "id" est défini sur facultatif dans RouteConfig.cs fichier.

Si vous souhaitez créer un "itinéraire personnalisé" dans le fichier RouteConfig sans chemin "id", vous pouvez laisser "id" ou un autre paramètre après l'action dans ce fichier. Dans ce cas, vos paramètres dans votre méthode Action dans le contrôleur ne traiteraient que les chaînes de requête.

J'ai trouvé cela très déroutant moi-même, alors vous n'êtes pas seul! Ils auraient dû concevoir un moyen simple d'ajouter des itinéraires de chaîne de requête pour des chaînes nommées spécifiques, tout nom de chaîne de requête et un nombre quelconque de chaînes de requête dans la conception de la configuration du fichier RouteConfig. En ne le faisant pas, l'utilisation des chaînes de requêtes dans les applications Web de MVC reste discutable, ce qui est assez étrange puisque les chaînes de requêtes constituent une partie stable du World Wide Web depuis le milieu des années 1990. :(

2
Stokely

Mon problème remplaçait mes paramètres de chaîne de requête par des valeurs par défaut:

routes.MapRoute(
    "apiRoute", 
    "api/{action}/{key}", 
    new { controller = "Api", action = "Prices", key = ""}
);

Peu importe ce que j'ai branché sur la chaîne de requête ou sur les résultats uniquement avec key="".

Puis débarrassé des écrasements par défaut en utilisant UrlParameter.Optional:

routes.MapRoute(
    "apiRoute", 
    "api/{action}/{key}", 
    new { controller = "Api", action = "Prices", key = UrlParameter.Optional }
);

à présent 

prices/{key} 

ou

prices?key={key} 

les deux fonctionnent bien.

1
spugna

Voici ce que je suis venu avec. J'avais de gros problèmes avec cela et je pense être maintenant dans MVC 6, mais cela pourrait être utile à quelqu'un, même à l'avenir.

// Le problème était que Reqest.Form Request.Querystring et Request ne fonctionnaient pas dans MVC, la solution consistait à utiliser Context.Request.Form et à s'assurer que le formulaire avait été soumis. Dans le cas contraire, un problème de référence ou de problème de contexte s'afficherait.

     if(Context.Request.ContentLength != null)
     {
         String StartDate = Context.Request.Form["StartMonth"].ToString();
         String EndMonth = Context.Request.Form["EndMonth"].ToString();
        // Vendor

     }
0
Deathstalker