web-dev-qa-db-fra.com

Objet de passage dans RedirectToAction

Je veux passer l'objet dans RedirectToAction. Ceci est mon code:

RouteValueDictionary dict = new RouteValueDictionary();
            dict.Add("searchJob", searchJob);
            return RedirectToAction("SearchJob", "SearchJob", dict);

où searchJob est une instance de SearchJob. Mais je ne reçois pas de données sur la méthode d'action SearchJob. Au lieu de cela, j'obtiens chaîne de requête de searchJob = Entity.SearchJob. Aidez-moi, s'il vous plaît. Qu'est-ce que je fais mal?

20
Jaggu

Vous ne pouvez pas passer de classe aux actions redirigées comme ça. La redirection se fait au moyen d'une URL. L'URL est une chaîne, elle ne peut donc pas contenir de classes ( la sérialisation des objets en url est vraiment hors de logique ici

Au lieu de cela, vous pouvez utiliser TempData

TempData["searchJob"] = searchJob;
return RedirectToAction ...;

et en action redirigé

Entity.SearchJob = (Entity.SearchJob)TempData["searchJob"] ;

Après avoir exécuté le code ci-dessus, TempData ne contiendra plus SearchJob. TempData est généralement utilisé pour une lecture unique.

Mais je n'aime pas le chemin ci-dessus. Si j'étais à votre place et que je voulais rechercher emplois par nom , j'ajouterais des paramètres d'itinéraire tels que

RouteValueDictionary dict = new RouteValueDictionary();
dict.Add("searchJobName", searchJob.JobName);

et le recevoir à l'action via le paramètre

public ActionResult SearchJob(string searchJobName)
{
... do something with the name
}

De cette façon, vous obtiendrez une meilleure URL et une URL plus conviviale pour HTTP. Du point de vue Action, tous les paramètres dont il a besoin seraient obtenus de l'extérieur. C'est mieux pour les tests, la maintenance, etc.

34
archil

Vous pourriez essayer:

return RedirectToAction("SearchJob", "SearchJob", new RouteValueDictionary(searchJob)

Passer l'objet searchJob dans le constructeur RouteValueDictionary décompose l'objet searchJob et transmet chaque propriété de la classe SearchJob en tant que valeur de route de niveau supérieur.

Avec le classeur de modèle par défaut, une action définie comme suit:

public ActionResult SearchJob(SearchJob searchJob)

Recevra un objet SearchJob entièrement réhydraté.

18
Charlie

Vous ne pouvez pas transmettre de classes à la méthode RedirectToAction. Si vous souhaitez transmettre un objet entier dans une chaîne de requête ou via POST, vous pouvez sérialiser l'objet à l'aide de XML ou JSON et désérialiser l'objet dans le contrôleur récepteur. Si vous utilisez cette approche pour faire attention à la taille de l'objet sérialisé.

0
Max Zerbini