【问题标题】:Transfering data between action methods ASP.NET在操作方法 ASP.NET 之间传输数据
【发布时间】:2017-01-10 12:42:03
【问题描述】:

我有以下操作方法:

    [HttpGet]
    public ActionResult DBLookupIndex(DBLookupDTO dto)
    {
        dto.Areas = _ph.GetProfiles();
        return View(dto);
    }

    [HttpGet]
    public ActionResult Search(DBLookupDTO dto)
    {
        dto.Orders = _oh.GetOrders(dto.OrderNumber, dto.ProductNumber, dto.DateRange, dto.SelectDeleted, dto.AreaId);
        return RedirectToAction("DBLookupIndex", dto);
    }

用户只需在网页上的一个或多个文本框中输入有效信息,然后按提交将其提交给控制器。然后这会调用 Search 操作。 通过调试,我确定该功能有效。它确实找到了它应该找到的东西,但是当它重定向回 DBLookupIndex-action 时,它没有被传递。

我的问题是;我做错了什么?我已经看到与上述类似的代码示例作为类似问题的解决方案,但由于某种原因它对我不起作用。

编辑:

在收到第一个答案后,我意识到我遗漏了一些信息。每当加载页面时,它都必须更新在视图中呈现的下拉列表,以防添加了新的配置文件/区域。我用剃须刀做到这一点:

     <select name="AreaId" asp-for="AreaId" class="form-control">
         <option disabled selected value=""> -- Vælg et område -- </option>
         @foreach (var a in Model.Areas)
         {
             <option value="@a.ProfileId">@a.Name</option>
         }

这就是为什么我必须使用 RedirectToAction,而不是让一个新动作呈现相同的视图。除非有更好的方法吗? :)

提前感谢您的帮助!

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    除了 Peter B 的回答之外,另一种选择是将其存储在您的基本控制器上存在的 TempData 对象中。

    [HttpGet]
    public ActionResult Search(DBLookupDTO dto)
    {
        var orders = new List<Order>();
    
        TempData["orders"] = orders;
        return RedirectToAction("DBLookupIndex", dto);
    }
    

    然后您可以像这样检索以下请求中的数据:

    [HttpGet]
    public ActionResult DBLookupIndex(DBLookupDTO dto)
    {
        var yourData = (List<Order>)TempData["orders"];
        ...
        return View(dto);
    }
    

    TempData 对象存在于单个请求中,然后被清除。你可以read more about it here

    【讨论】:

    • 理论上,这似乎是可行的方法,但问题是,我的 GetOrder() 方法返回一个 List(订单列表)。我很快就尝试用谷歌搜索,但一直没能找到解决这个问题的方法(至少我目前的编程技能水平无法理解)。也许你有一个建议?感谢您的帮助!
    • 您应该能够直接存储对象,然后将其投射出来(请参阅我更新的答案)。或者,您可以按照建议here 将其序列化/反序列化到 JSON 或从 JSON 序列化/反序列化
    • 非常感谢您的帮助! ...并感谢您的链接。之前没用过TempData,因为不知道怎么正确使用,但现在对它的工作原理有了更深入的了解。你和彼得都为我的问题提供了可靠(有效)的解决方案,所以我会尝试找出我将使用哪一个。感谢您花时间帮助我:)
    • 没问题。乐于助人!
    【解决方案2】:

    RedirectToAction 中的 object 参数旨在为生成的 URL 设置查询字符串值,然后作为“重定向到其他页面”结果发送到浏览器。它应该是类似于new { id = 7, otherParam = 5 } 或字典的对象,但肯定不是记录集或任何其他类型的业务数据。

    您似乎想显示属于 DBLookupIndex 操作的视图。这可以通过一种非常简单的方式完成,如下所示:

    [HttpGet]
    public ActionResult Search(DBLookupDTO dto)
    {
        dto.Orders = _oh.GetOrders(dto.OrderNumber, dto.ProductNumber, dto.DateRange, dto.SelectDeleted, dto.AreaId);
        return View("DBLookupIndex", dto); // Render the "DBLookupIndex" view and pass it the dto object
    }
    

    更新:如果您需要始终设置 dto.Areas,您可以创建一个方法来完成此操作。

    像这样(1):

    [HttpGet]
    public ActionResult DBLookupIndex(DBLookupDTO dto)
    {
        SetAreas(dto);
        return View(dto);
    }
    
    [HttpGet]
    public ActionResult Search(DBLookupDTO dto)
    {
        dto.Orders = _oh.GetOrders(dto.OrderNumber, dto.ProductNumber, dto.DateRange, dto.SelectDeleted, dto.AreaId);
        SetAreas(dto);
        return View("DBLookupIndex", dto);
    }
    
    private void SetAreas(DBLookupDTO dto)
    {
        dto.Areas = _ph.GetProfiles();
    }
    

    或者像这样(2):

    [HttpGet]
    public ActionResult DBLookupIndex(DBLookupDTO dto)
    {
        return SetAreasAndView(dto);
    }
    
    [HttpGet]
    public ActionResult Search(DBLookupDTO dto)
    {
        dto.Orders = _oh.GetOrders(dto.OrderNumber, dto.ProductNumber, dto.DateRange, dto.SelectDeleted, dto.AreaId);
        return SetAreasAndView(dto);
    }
    
    private ActionResult SetAreasAndView(DBLookupDTO dto)
    {
        dto.Areas = _ph.GetProfiles();
        return View("DBLookupIndex", dto);
    }
    

    【讨论】:

    • 我在我的问题中添加了更多信息。你的解决方案让我意识到,我错过了一些东西:)
    • 谢谢!你提供的两个例子都可以用来解决我的问题!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多