按日期搜索后无法跳转结果视图,数据传递失败求助
问题1:无法跳转到searcheResultPage视图的解决办法
核心原因
- 当前控制器的
searchForm方法返回View(result)时,默认会渲染与Action同名的searchForm视图,而非目标的searcheResultPage。 - 你用了AJAX的
$.post请求,AJAX是异步请求,就算控制器返回正确视图,浏览器也不会自动跳转页面,只会接收响应的HTML内容,不会触发页面刷新跳转。
方案1:改用表单提交(推荐,无需AJAX)
把搜索区域改成表单提交,直接指向处理结果的Action,控制器返回指定视图:
- 修改searchForm视图代码:
<form action="/Main/SearchResult" method="post"> <div class="input-field col m6 s12"> <input data-jdp id="date" type="text" name="fromTime"> <!-- 必须加name属性,控制器才能接收参数 --> <label class="contact-input" for="date">Date</label> </div> <!-- 补充driver的输入控件,同样要加name属性,这里以隐藏域为例,根据实际情况调整 --> <input type="hidden" name="driver" value="这里替换成实际获取的driver值" /> <button id="getArchiveWarm" class="waves z-depth-4 mr-1 mb-2" type="submit">searchForCars</button> </form>
- 修改控制器,新增
SearchResultAction:
[HttpPost] public ActionResult SearchResult(DateTime fromTime, string driver) { var result = secondPage(fromTime, driver); // 明确指定返回searcheResultPage视图,并传入模型数据 return View("searcheResultPage", result); } public List<be.Dto.warmValuesDto> secondPage(DateTime fromTime, string driver) { var result = _context.searching(fromTime, driver); return result; }
方案2:保留AJAX,手动跳转(需处理数据传递)
如果一定要用AJAX,需要在请求成功后手动跳转到结果页,同时把数据暂存:
- 修改控制器代码:
[HttpPost] public ActionResult searchForm(DateTime fromTime, string driver) { var result = secondPage(fromTime, driver); // 把数据存到TempData,默认仅保留到下一次请求 TempData["SearchResult"] = result; // 返回跳转地址 return Json(new { redirectUrl = Url.Action("searcheResultPage") }); } public ActionResult searcheResultPage() { // 从TempData取出数据并转换类型 var result = TempData["SearchResult"] as List<be.Dto.warmValuesDto>; return View(result); }
- 修改JQuery代码:
$('#getArchiveWarm').click(function (event) { event.preventDefault(); // 阻止按钮默认行为 var input0 = $('#date').val(); // 确保正确获取日期值 var Name = ""; // 替换成实际获取driver值的代码 $.post("/Main/searchForm", { fromTime: input0, driver:Name }, function(data) { if(data.redirectUrl) { window.location.href = data.redirectUrl; } }); });
问题2:Redirect传递List数据为空的解决办法
核心原因
RedirectToAction是重定向,会发起全新的GET请求,原请求的模型数据不会自动携带;而且直接把List作为GET参数传递,不仅有长度限制,复杂对象也无法通过URL参数直接传递。
解决方案:用TempData存储List数据
TempData专门用于重定向场景下传递数据,生命周期为下一次请求结束:
- 修改控制器代码:
[HttpPost] public ActionResult searchForm(DateTime fromTime, string driver) { var result = secondPage(fromTime, driver); // 存储数据到TempData,需确保warmValuesDto可序列化 TempData["SearchResultList"] = result; // 重定向到结果页Action return RedirectToAction("searcheResultPage"); } public ActionResult searcheResultPage() { // 从TempData取出并转换类型 var resultList = TempData["SearchResultList"] as List<be.Dto.warmValuesDto>; return View(resultList); }
- 确保DTO类可序列化:
[Serializable] public class warmValuesDto { public string WarmCarNumber { get; set; } public string WarmCarDriverName { get; set; } // 其他属性... }
注意事项
- 如果需要多次使用TempData中的数据,可调用
TempData.Keep("SearchResultList")延长其生命周期。 - TempData默认依赖Session,若Session禁用,可改用数据库临时存储(不推荐大List用URL参数传递)。
内容的提问来源于stack exchange,提问作者Hamed Zahiri
相关产品推荐
相关产品推荐

