在MVC中传递复杂对象时使用RedirectToAction方法

3

我知道这个问题已经被问过很多次并且得到了答案,但是没有一个解决方案对我有效。

这是我的视图模型:

public class FlightSearchResults
{
    public FlightSearch SearchModel { get; set; }
    public List<vwLowFareSearchResults> SearchResults { get; set; }
    public string TestString { get; set; }
    public DateTime TestDate { get; set; }
}

我正在使用RedirectToAction,代码如下:

FlightSearchResults flightSearchResults = new FlightSearchResults();
flightSearchResults.SearchModel = model;
flightSearchResults.SearchResults = flights;
flightSearchResults.TestDate = DateTime.Now.AddDays(-2);
flightSearchResults.TestString = "Just Testing . . .";
return RedirectToAction("index", "flights", flightSearchResults);

在我的航班索引中,我只获取了这个 List<vwLowFareSearchResults> SearchResults 属性,其他属性都没有被赋值。我尝试了一些来自StackOverFlow上的线程的几个变化,例如:

return RedirectToAction("index", "flights", new { SearchResults = flights, SearchModel = model });
return RedirectToAction("Result", "Dialog", new RouteValueDictionary(flightSearchResults));

我可以这样返回视图:

return View("~/Views/Flights/Index.cshtml", flightSearchResults);

但是这并不是一个很好的解决方案,因为URL没有更新。我正在修改一些较旧的项目,使用Session和Viewbag会导致混乱。
我需要简化上一个代码中视图和控制器之间的数据通信模式。有没有可能在简单的RedirectToAction中不使用ViewData或Viewbag来实现这一点。
如果能给予任何帮助来达成这个目标,那将非常棒,因为我对MVC还很新手。

2
永远不要将复杂对象传递给GET方法。除了生成的丑陋查询字符串之外,如果模型包含复杂对象或集合属性(如您的模型),则绑定会失败。而且有可能超过查询字符串限制并抛出异常。保存您的模型,将其ID传递给GET方法,在GET方法中再次检索模型。 - user3559349
我没有将任何内容保存在数据库中,列表来自API,我需要在进行一些计算后在页面上显示它,因此如果用户决定更新搜索查询,则需要该模型。一个控制器如何调用另一个控制器并传递数据? - Ali Umair
你需要将它保存在某个地方。如果你不想将它保存到数据库中,会话是一个选项。 - user3559349
你是在说这个无法实现,我必须先把它保存在某个地方吗? - Ali Umair
2
@EhsanSajjad,当模型包含集合时并不是一个好主意 - 很容易超出查询字符串限制并抛出异常。 - user3559349
显示剩余4条评论
1个回答

1
这是我最近使用的一种方法。请尝试:-
        ... Previous code omitted.
        //In your controller action, save the data to TempData...
        TempData["FlightSearchResults"] = FlightSearchResults;

        return RedirectToAction("flights");
    }

    public ActionResult flights()
    {
        FlightSearchResults flightResults = TempData["FlightSearchResults"];

        return View(flightResults);
    }

我实际上使用NewtonSoft将对象序列化为字符串,然后在目标操作中再次反序列化。因此,你可能想尝试类似于...

using Newtonsoft.Json;
...
...

        ... Previous code omitted.
        //In your controller action, save the data to TempData...
        TempData["FlightSearchResults"] = JsonConvert.SerializeObject(FlightSearchResults);

        return RedirectToAction("flights");
    }

    public ActionResult flights()
    {
        string storedResults = TempData["FlightSearchResults"].ToString();

        FlightSearchResults flightResults = JsonConvert.DeserializeObject<FlightSearchResults>(storedResults);

        return View(flightResults);
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接