Comment passer d'un objet modifié non persistant à la vue du contrôleur sans formulaire?

StackOverflow https://stackoverflow.com/questions/295200

  •  08-07-2019
  •  | 
  •  

Question

Short: comment la liaison de modèle passe-t-elle les objets de la vue au contrôleur?

Long:
Tout d'abord, en fonction des paramètres fournis par l'utilisateur via un formulaire de recherche, certains objets sont extraits de la base de données. Des métadonnées sont données à ces objets qui sont visibles (mais ne définissent pas) pour le client (par exemple: la dénomination et la tarification des objets diffèrent d'une région à l'autre).
Plus tard dans le site, l'utilisateur peut cliquer sur des liens qui doivent montrer les détails de ces objets. Étant donné que ces métadonnées sont importantes pour l'affichage, mais pas pour la définition, je dois récupérer l'objet précédemment modifié dans le contrôleur. Lorsque j'utilise la liaison de modèle asp.net mvc par défaut, la méthode .ToString () est utilisée. Cette route ne renvoie pas de chaîne pertinente pour recréer l'objet complet.
J'aurais pensé que l'interface ISerializable serait impliquée, mais ce n'est pas le cas. Comment dois-je aller pour obtenir l'effet désiré? Je ne peux pas imaginer que je sois le premier à être confronté à cette question, alors je suppose que je manque quelque chose quelque part ...

Était-ce utile?

La solution

La liaison de modèle par défaut prend les paramètres de forme par nom et les met en correspondance avec les propriétés du type spécifié dans la liste d'arguments. Par exemple, votre modèle a des propriétés " Prix " et "Nom", le formulaire doit alors contenir des entrées avec identifiants / noms "Prix". et " Nom " (Je suppose que cela fait une correspondance insensible à la casse). Le classeur utilise la réflexion pour convertir les valeurs de formulaire associées à ces clés dans le type approprié et l’assigne aux propriétés d’un objet nouvellement créé du type spécifié par le paramètre (dérivé de nouveau par réflexion).

Vous pouvez réellement consulter (et télécharger) le code source à l'adresse http://www.codeplex.com / aspnet , mais vous devrez explorer la source MVC à partir de là. Je donnerais un lien vers la source DefaultModelBinder, mais la façon dont ils sont construits, je pense que le lien change à mesure que des révisions sont introduites.

Ainsi, pour répondre à votre question, vous devez définir sur votre formulaire des paramètres (susceptibles d'être masqués) qui correspondent aux propriétés de l'objet que vous souhaitez recréer. Lorsque vous envoyez le formulaire (dans la vue) au contrôleur, le classeur doit reconstituer un objet du type spécifié à l'aide des paramètres de formulaire. Si vous devez convertir les valeurs du paramètre form en propriétés d'objet, vous devrez probablement implémenter votre propre classeur de modèle personnalisé.

[EDIT] En réponse à votre deuxième message:

Supposons que nous souhaitons créer un lien vers une action utilisant un objet personnalisé. Nous pouvons stocker l'objet personnalisé dans TempData (ou dans la session si nous en avons besoin pour durer plus d'une publication) avec une clé particulière. Nous pouvons ensuite construire le lien d'action et fournir la clé de l'objet en tant que valeur à ActionLink dans une classe anonyme. Ceci repassera la clé en tant que paramètre Request. Dans notre action, nous pouvons utiliser la clé de ce paramètre pour récupérer l'objet de TempData.

<%= Html.ActionLink( ViewData["CustomObject1",
                     "Select",
                     new { TempDataKey = ViewData["CustomObject1_Key"] }
                   ) %>
&nbsp;

public ActionResult Select()
{
    Entity custObj = null;
    string objKey = Request.Params["TempDataKey"];
    if (!string.IsNullOrEmpty(objKey))
    {
       custObj = (Entity)TempData[objKey];
    }

    ... continue processing
}

Autres conseils

@tvanfosson

Merci pour votre explication, mais qu'en est-il des liens? (pas de formulaires impliqués) Actuellement, Html.ActionLink (c = > c.Action (paramètre), "label") accepte les objets en tant que paramètre. Ceux-ci doivent être traduits en parties URL. Pour cela, MVC passe TOUJOURS à la méthode .ToString (). Je ne veux pas sérialiser mon objet dans la méthode ToString.
Est-ce que je ne devrais pas pouvoir aider le framework à sérialiser mon objet? Dis via l'interface ISerialize ou quelque chose comme ça?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top