2017-03-15 1 views
1

J'ai travaillé principalement sur des applications de bureautique et j'ai pensé apprendre le développement Web en utilisant ASP.Net MVC5 et en parcourant le livre par Jon Galloway. Donc, je lisais sur la façon dont vous pouvez passer les paramètres aux méthodes d'action en utilisant la chaîne de requête commeParamètre de chaîne de requête par rapport au paramètre habituel ASP.Net MVC 5

/magasin/Parcourir? Genre = Disco

ou les intégrer directement dans l'URL comme

/Store/Détails/5

Il est maintenant en dessous du code du contrôleur que j'ai écrit (tiré du livre):

namespace MvcMusicStore.Controllers 
{ 
    public class StoreController : Controller 
    { 
     // GET: Store 
     public string Index() 
     { 
      return "Hello from Store.Index()"; 
     } 

     public string Browse(string genre) 
     { 
      string message = HttpUtility.HtmlEncode("Store.Browser, Genre = " + genre); 
      return message; 
     } 

     public string Details(int id) 
     { 
      string message = "Store.Details, ID = " + id; 
      return message; 
     } 
    } 
} 

L'URL s'ouvre correctement et les actions renvoient le message comme prévu. Mais juste pour essayer, j'essayé de passer la valeur de genre en l'intégrant dans l'URL comme

/magasin/Parcourir/Rap

mais cela ne fonctionne pas comme il l'a fait pour les détails() action. Je pensais que cela peut avoir à faire quelque chose avec le type de données genre, donc j'essayé de changer le type d'identification des données dans les détails() à chaîne comme ci-dessous:

public string Details(string id) 
     { 
      string message = "Store.Details, ID = " + id; 
      return message; 
     } 
} 

et a ouvert l'url

/Magasin/Détails/5

et retourne action Details() message avec identifiant 5, mais quand je fais la même chose pour l'action Parcourir()

/Store/Browse/Rap

l'action ne renvoie pas le message avec la valeur de genre "Rap". J'ai essayé de passer la valeur du genre et j'ai enlevé le codage html pour voir si cela avait quelque chose à voir avec ça, mais ce n'était pas le cas.

J'ai regardé l'article here mais cela n'a pas aidé non plus. Tous les commentaires ont apprécié.

Répondre

2

Votre utilisant la voie Default qui est défini comme

url: "{controller}/{action}/{id}", 

et attend une valeur pour id. Lorsque vous utilisez /Store/Browse/Rap, la valeur du 3ème segment ("Rap") sera liée à un paramètre nommé id, mais votre méthode Browse() n'en contient pas (son nom est genre).

Modifiez le nom du paramètre de sorte que son

public string Browse(string id) 

et la valeur de id sera « Rap »,

Ou créer une définition d'itinéraire spécifique et placez-le avant que la route Default (et maintenir la méthode Browse() tel quel)

routes.MapRoute(
    name: "Browse", 
    url: "Store/Browse/{genre}", 
    defaults: new { controller = "Store", action = "Browse", genre = UrlParameter.Optional } 
); 
... // default route here 

Note latérale: Vous n'avez pas besoin de changer le type du paramètre dans la méthode Details si vous passez toujours une valeur qui est valide int

+0

Merci, cela explique la confusion. – Naphstor