Estoy tratando de pasar datos a una acción dentro del mismo controlador. Estoy usando RedirectToAction , pero no tengo éxito. Se llama a la acción pero los datos que estoy tratando de pasarle tienen sus valores null .
Mi modelo:
public class PlaylistModel { public Guid PlayListID { get; set; } [Display(Name = "Nome da Playlist")] public string NomePlayList { get; set; } [Display(Name = "Descrição")] public string Descricao { get; set; } [Display(Name = "Código")] public string CodigoPlayList { get; set; } public string Estado { get; set; } public string EmailUser { get; set; } public List<VideoThumbnails> VideosIdsYoutube { get; set; } [Display(Name = "Categorias")] public List<string> Categorias { get; set; } }Esta acción recibe los datos, realiza el procesamiento y llama a la otra acción.
[HttpPost] public ActionResult CreatePlaylist(string Categorias, string NomePlayList) { PlaylistModel playListModel = new PlaylistModel(); playListModel.VideosIdsYoutube = AppCache.Instance.VideoParaAPI.VideoThumbnails.ToList(); playListModel.Categorias = Categorias.Split(',').ToList(); playListModel.NomePlayList = NomePlayList; playListModel.Estado = EnumEstadoDaPlayList.Nova.ToString(); playListModel.EmailUser = AppUser.User.Email; var api = new AccessAPI.Playlist.AccessAPIPlaylist(); var playlist = api.CriarNova(playListModel); if(playlist != null) { return RedirectToAction("ExibirPlaylist", new RouteValueDictionary(new { controller = "Playlist", action = "ExibirPlaylist", pPlayList = playlist })); } else { return Problem("Não foi possível criar a playlist!"); } } Esta otra acción es llamada por la anterior, pero el modelo llega con valores null
[HttpGet] public ActionResult ExibirPlaylist(PlaylistModel pPlayList) { var apiVideo = new AccessAPI.Video.AccessAPIVideo(); var videos = apiVideo.ConsultarPorPlayListId(pPlayList.PlayListID).ToList(); if(videos.Count > 0) { videos.ForEach(v => { pPlayList.VideosIdsYoutube.Add(new Dommain.Cache.VideoThumbnails() { CanalID = v.CanalID, DataDePublicacao = v.DataDePublicacao, NomeDoCanal = v.NomeDoCanal, NomeDoVideo = v.NomeDoVideo, Thumbnail = v.Thumbnail, VideoId = v.VideoIdYoutube}); }); } return View(); }RouteValueDictionary en RedirectToAction() pasa solo tipos simples, como string , int , etc. RedirectToAction() no serializa los tipos de datos complejos. Por lo tanto, puede ser la forma más fácil de usar TempData .
En CreatePlaylist(string Categorias, string NomePlayList) :
TempData["playListModel"] = playlist; return RedirectToAction("ExibirPlaylist");Y entonces:
[HttpGet] public ActionResult ExibirPlaylist() { if (TempData["playListModel"] is PlaylistModel pPlayList) { // Your code using `pPlayList` } return View("Index"); }El MVC usa la serialización binaria, por defecto. Y en algunos casos, la serialización binaria puede fallar: el almacenamiento de objetos (cosas que no son cadenas) en TempDataDictionary no funciona correctamente . Por lo tanto, es preferible serializar el objeto especificado en una cadena JSON mediante JsonConvert.SerializeObject() .