none
MVC : passage de paramètre RRS feed

  • Question

  • Bonjour tout le monde,

    Ah, newsgroup=aspnetfr, ça n'existe plus ? D'habitude je mets ça dans l'URL et ça rectifie la liste des newsgroups ...

    MVC, c'est ici alors ?

    J'ai développé l'amorce d'application de blog proposée , et à présent je tâche de la poursuivre, notamment en présentant les listes de posts pour un blog. Pour ça ça m'aide bien d'avoir développé l'application movies, car on y explique comment développer une recherche.

    Depuis l'action Detail du contrôleur Blog, je redirige sur une nouvelle action IndexOneBlog du contrôleur Post, qui affiche une liste, filtrée selon un numéro de blog reçu en paramètre. La prochaine fois que je ferai ça je vérifierai si passer au contrôleur Post est une coquetterie dont j'aurais pu m'abstenir.

    En entête de la liste correspondante j'affiche les deux champs caractéristiques du blog, en les passant via ViewBag (auteur, titre).

    Maintenant, il me reste à retoucher le lien Create New Post, pour qu'il arrête de demander à l'utilisateur le numéro de blog dans lequel placer le nouveau post, avec le malin plaisir de lui débiter un chapelet d'injures si jamais il fournit un numéro de blog qui n'existe pas.

    Il y a un moyen assez simple de passer l'id du blog, c'est de mettre dans le code de l'action IndexOneBlog, juste avant l'ouverture de la vue :

    ViewBag.id = id;

    ce qui permet de récupérer ça dans le lien nouveau post comme ceci :

    @Html.ActionLink("Create New Post", "Create", new{id = @ViewBag.id})

    et ça passe.

    Alors maintenant voilà la question : ce numéro étant proposé dans l'URL, par défaut dans le troisième paramètre, celui qui s'appelle id, je me dis qu'il doit y avoir moyen de le récupérer sans avoir à encombrer le ViewBag avec ça, mais j'ai essayé plusieurs syntaxes en vain. Quelqu'un saurait-il me proposer une syntaxe qui se tient ?

    Petite précision : le numéro est affiché sur toutes les lignes, mais le lien nouveau post est en dehors des lignes de la liste.

    Sur un autre sujet : pour pouvoir utiliser le ViewBag, il a fallu que j'ajoute la référence Microsoft.csharp à partir du menu projet, alors que je ne me rappelle pas avoir eu à le faire il y a quelques mois. Dans la semaine, j'ai ouvert un fil au sujet de la référence system.web.optimization que j'ai dû installer par la console du gestionnaire de package, alors que je ne me rappelle pas avoir eu à le faire il y a quelques mois. Ai-je manqué une lecture au sujet des références dans MVC ? Je suis parti d'un type de projet MVC4 "de base", en tout cas cette semaine. Ah, il y a quelques mois j'en ai peut-être choisi un autre ? Peut-être un avec le support de l'authentification.

    • Modifié Gloops samedi 19 juillet 2014 14:42
    samedi 19 juillet 2014 14:26

Réponses

  • Bonjour,

    Pour votre question : "Il doit y avoir moyen de le récupérer sans avoir à encombrer le ViewBag avec ça".

    Qu'entendez-vous par réccupérer ?, à ce moment là, où vous situez-vous (Vue, Action du controller ?)

    Personnellement, je ne me suis jamais vraiment inquiété quand à l'utilisation du ViewBag pour transporter ce genre de données du Controller vers la Vue puisque dans ce cas :

    - Il s'agit d'un integer (4 octets)

    - Le ViewBag est temporaire (la durée de vie ne dépasse pas celle du rendu de la vue)

    - Cette solution me semble plus lisible que celle que je vais vous proposer

    Si vous souhaitez pouvoir récupérer un paramètre faisant partie de la route dans votre vue, vous pouvez utiliser ce genre de syntaxe :

    Request.RequestContext.RouteData.Values["id"]

    Cordialement,


    Kevin BEAUGRAND, Modis FRANCE
    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont résolu votre problème.

    • Marqué comme réponse Gloops dimanche 20 juillet 2014 10:28
    dimanche 20 juillet 2014 07:40

Toutes les réponses

  • Bonjour,

    Pour votre question : "Il doit y avoir moyen de le récupérer sans avoir à encombrer le ViewBag avec ça".

    Qu'entendez-vous par réccupérer ?, à ce moment là, où vous situez-vous (Vue, Action du controller ?)

    Personnellement, je ne me suis jamais vraiment inquiété quand à l'utilisation du ViewBag pour transporter ce genre de données du Controller vers la Vue puisque dans ce cas :

    - Il s'agit d'un integer (4 octets)

    - Le ViewBag est temporaire (la durée de vie ne dépasse pas celle du rendu de la vue)

    - Cette solution me semble plus lisible que celle que je vais vous proposer

    Si vous souhaitez pouvoir récupérer un paramètre faisant partie de la route dans votre vue, vous pouvez utiliser ce genre de syntaxe :

    Request.RequestContext.RouteData.Values["id"]

    Cordialement,


    Kevin BEAUGRAND, Modis FRANCE
    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont résolu votre problème.

    • Marqué comme réponse Gloops dimanche 20 juillet 2014 10:28
    dimanche 20 juillet 2014 07:40
  • Bonjour, merci pour cette réponse.

    Effectivement, ça marche.

    Evidemment, si la réponse arrive par quelqu'un qui me dit que c'était mieux comme je faisais avant ... :)

    Je ne sais pas exactement où on peut trouver @Html.ActionLink ailleurs, mais là c'est dans une vue, matérialisée par un fichier cshtml.

    Je me dis d'ailleurs qu'on pourrait panacher les deux syntaxes.

    Jusque là, dans le contrôleur, ActionResult reçoit un argument int id, et c'est ça que je passe en paramètre :

    ViewBag.Id = id;

    Là où je parlais de panacher, c'est que je vois que par défaut ViewBag.Title est initialisé en haut de la vue, on pourrait faire pareil avec ID:

    @{
        ViewBag.Title = "IndexOneBlog";
        ViewBag.Id = Request.RequestContext.RouteData.Values["id"];
    }
    
    C'est certes plus lourd comme syntaxe, mais ça évite d'avoir à changer de fichier pour visualiser l'initialisation. Peut-être est-ce un peu ténu comme avantage pour en faire une généralité, ça dépend des habitudes de chaque équipe ...

    dimanche 20 juillet 2014 10:27