2010-07-13 4 views
1

Je rencontre des difficultés avec le concept de routage dans le cadre ASP.NET MVC. Par exemple, j'ai une méthode de commande:ASP.NET MVC - Routage encore confus pour moi

public class UploadController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(); 
    } 

    [AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult GetChildFolders(string id) 
    { 

     IEnumerable<MyModel> list = MyModelDataContext.GetChildFolders(new Guid(id)); 

     IEnumerable<SelectListItem> listitems = list.Select(row => new SelectListItem 
                  { 
                   Value = row.FolderID.ToString(), 
                   Text = row.FolderName 
                  }); 

     return this.Json(listitems, JsonRequestBehavior.AllowGet); 
    } 
} 

et voici mon itinéraire:

routes.MapRoute(
    "UploadRoute", // Route name 
    "Upload/{id}", // URL with parameters 
    new { controller = "Upload", action = "Index", id = UrlParameter.Optional 
}); 

Maintenant, si j'ai deux fonctions jQuery:

function TeamChange1() { 
    var id = $('#TeamList').val(); 
    $.getJSON('/Upload/GetChildFolders/' + id, null, function(data) { 
     bindOptionResults(data); 
    }); 
} 

function TeamChange2() { 
    var id = $('#TeamList').val(); 
    $.getJSON('/Upload/GetChildFolders', id, function(data) { 
     bindOptionResults(data); 
    }); 
} 

TeamChange1() appellera la Méthode GetChildFolders() avec le paramètre id correctement câblé et rempli, cependant, avec TeamChange2(), le paramètre id reste null dans la méthode du contrôleur. Cela doit être un problème de routage qui provoque cela. Quelle est l'explication?

+0

Vous n'avez pas publié l'itinéraire GetChildFolders. J'imagine que c'est pareil. Sur un autre sujet, vous pourriez être intéressé par cette question http://stackoverflow.com/questions/894779/asp-net-mvc-routing-via-method-attributes – dotjoe

Répondre

2

Vous n'avez pas besoin de routage ici. En fait, la route par défaut {controller}\{action}\{id} correspond déjà à votre contrôleur, action et nom de paramètre (id). La définition de UploadRoute est donc redondante.

La raison pour laquelle TeamChange2() ne fonctionne pas est que id est une chaîne, pas un objet. Le code approprié est:

function TeamChange2() { 
    var id = $('#TeamList').val(); 
    $.getJSON('/Upload/GetChildFolders', {id: id}, function(data) { 
     bindOptionResults(data); 
    }); 
} 

Cela passera id dans la collection params au lieu de l'URL. MVC ne s'en soucie pas et liera toujours puisque le nom du paramètre correspond au paramètre de route id. Regardez les demandes dans FireBug pour voir la différence.

De plus, vous pouvez modifier le paramètre id dans l'action du contrôleur pour le type de données Guid afin de ne pas avoir à faire new Guid(id) dans le code.

+0

Comment regarder ce genre de requête dans Firebug? Ce serait vraiment utile. Onglet DOM? – stupidkid

+0

Ce sera dans l'onglet console. Assurez-vous d'ouvrir l'onglet lorsque vous chargez la page pour la première fois. La première méthode devrait être publiée dans '/ Upload/GetChildFolders/1234' et la seconde dans'/Upload/GetChildFolders'. Si vous développez le second et regardez l'onglet params, vous verrez 'id: 1234' listé. – Ryan

1

Essayez ceci pour la deuxième fonction. L'essentiel est la structure des données post {nom: valeur}

function TeamChange2() { 
    $.getJSON('/Upload/GetChildFolders', {id : $('#TeamList').val()}, function(data) { 
     bindOptionResults(data); 
    }); 
} 
0

pourriez-vous pas construire l'URL dans TeamChange2 que vous avez fait dans TeamChange1?

function TeamChange2() { 
    var id = $('#TeamList').val(); 
    $.getJSON('/Upload/GetChildFolders/' + id, null, function(data) { 
     bindOptionResults(data); 
    }); 
} 

Je crois que c'est comme ça que je le fais habituellement.