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?
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.
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é.
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é.