在动作方法ASP.NET之间传输数据

时间:2017-01-10 12:42:03

标签: c# asp.net

我有以下行动方法:

    [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);
    }

用户只需将有效信息输入网页上的一个或多个文本框,然后按提交即可将其提交给控制器。然后调用搜索 -action。 通过调试,我确定该功能有效。它确实找到了它应该发生的事情,但它没有被传递,当它重定向回 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,而不是让新的动作呈现相同的视图。除非有更好的方法吗? :)

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

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

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

[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);
}

答案 1 :(得分:0)

除了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