You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

按日期搜索后无法跳转结果视图,数据传递失败求助

问题1:无法跳转到searcheResultPage视图的解决办法

核心原因

  • 当前控制器的searchForm方法返回View(result)时,默认会渲染与Action同名的searchForm视图,而非目标的searcheResultPage。
  • 你用了AJAX的$.post请求,AJAX是异步请求,就算控制器返回正确视图,浏览器也不会自动跳转页面,只会接收响应的HTML内容,不会触发页面刷新跳转。

方案1:改用表单提交(推荐,无需AJAX)

把搜索区域改成表单提交,直接指向处理结果的Action,控制器返回指定视图:

  1. 修改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>
  1. 修改控制器,新增SearchResult Action:
[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,需要在请求成功后手动跳转到结果页,同时把数据暂存:

  1. 修改控制器代码:
[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);
}
  1. 修改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专门用于重定向场景下传递数据,生命周期为下一次请求结束:

  1. 修改控制器代码:
[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);
}
  1. 确保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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 03:55:28