Bonjour,

Je débute en ASP.NET MVC et j'aimerais poser une question :

Dans tous les tutoriaux MVC que je lis, il est indiqué que pour passer des paramètres à une méthode de contrôleur via l'URL, il suffit de faire quelque chose du style :

/Home/Index/2

Home => Contrôleur (HomeController)
Index => Méthode de contrôleur
2 => Paramètre

En gros, mon problème est que je n'arrive pas à passer de paramètres à une méthode de contrôleur via cette façon d'écrire l'URL.

Je vais prendre 2 exemples pour étayer mes propos. Dans mon projet MVC :
J'ai un modèle 'stagiaire'.
J'ai un contrôleur 'StagiaireController' lié à ce modèle.

Code du contrôleur 'StagiaireController'

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
 
using MvcApplication1.Models.Personne;
using MvcApplication1.Models.Formations;
 
 
namespace MvcApplication1.Controllers
{
 
    public class StagiaireController : Controller
    {
 
        public ActionResult Index()
        {
            return View();
        }
 
        public ActionResult Test(int abc)
        {
            return RedirectToAction("GestionStagiaires");
        }
 
 
 
        public ActionResult GestionStagiaires(int? aIdentifiantCours)
        {
            List<Stagiaire> oListeStagiaires = null;
            if (aIdentifiantCours.HasValue)
            {
                Cours oCours = Cours.GetInstance(aIdentifiantCours.Value); // Obtention d'un  cours grâce à son id
                oListeStagiaires = oCours.GetListeStagiaires(); // Obtention de la liste de stagiaires participant à ce cours
            }
            else
            {
                oListeStagiaires = Stagiaire.ListeStagiaires; //=> Liste de tous les stagiaires
            }
 
 
            return View(oListeStagiaires);
        }
    }
}
Par exemple, je n'arrive pas à passer le paramètre aIdentifiantCours à ma méthode "GestionStagiaires" lorsque je tape l'URL suivant :

http://localhost:2751/Stagiaire/GestionStagiaires/2
=> /Stagiaire/GestionStagiaires/2 => Le paramètre est ignoré

Par contre, j'arrive à passer ce paramètre avec cet URL (dont j'ai récupérer la syntaxe grâce aux html.ActionLink ..)

http://localhost:2751/Stagiaire/Gest...tifiantCours=2
=> /Stagiaire/GestionStagiaires/?aIdentifiantCours=2 => le paramètre est pris en compte


De même, pour ma méthode 'Test' de 'StagiaireController' =>
Lorsque je tape l'URL : /Stagiaire/Test/3 => cela entraine une erreur.
Lorsque je tape l'URL : /Stagiaire/Test/?abc=3 => cela fonctionne.


Pourquoi cela ne fonctionne t-il pas avec la 1ere façon décrire l'URL ? Alors que je ne vois que cette syntaxe dans les tutoriaux..?


Merci de votre aide.


[EDIT]

J'ai fait quelques tests et quelques recherches sur mon projet, je pense que mon problème est en partie lié au routage dans le fichier Global.asax.cs de mon projet.

Voici le contenu de ce fichier par défaut :


Contenu du fichier Global.asx.cs par défaut
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
 
namespace MvcApplication1
{
    // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
    // visit http://go.microsoft.com/?LinkId=9394801
 
    public class MvcApplication : System.Web.HttpApplication
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
 
            routes.MapRoute(
                "Default", // Route name
                "{controller}/{action}/{id}", // URL with parameters
                new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
            );
        }
 
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
 
            RegisterRoutes(RouteTable.Routes);
        }
    }
}
Lorsque j'essaye de passer des paramètres via la syntaxe URL n°1 (celle des tutoriaux, censé fonctionner (ex : /Home/Index/1 )) à des méthodes de contrôleur qui ont dans leur signature, un paramètre nommé id, cela fonctionne !
Si je change ce paramètre id en idToto dans la signature de ma méthode, la méthode via syntaxe URL n°1 ne fonctionne plus !

J'en déduis que c'est lié à ce qui est écrit dans ce fichier Global.asax.

Quelqu'un peut il m'expliquer un peu plus en détails le fonctionnement de ce système de routage et son implication dans le passage de paramètre via la syntaxe URL n°1 ( ex: Home/Index/1)


[/EDIT]