我有以下行动方法:
[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,而不是让新的动作呈现相同的视图。除非有更好的方法吗? :)
提前感谢您的帮助!
答案 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。