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

MVC5中Ajax调用控制器后无法实现页面重定向问题求助

解决MVC5中Ajax提交后不重定向/表单提交数据为null的问题

首先,你遇到的问题其实是Ajax和表单提交两种方案的特性差异导致的,咱们一步步拆解解决:

为什么Ajax提交后页面没反应?

Ajax本质是异步局部请求,它只会默默接收控制器返回的响应内容,但不会自动触发浏览器的页面跳转。你现在控制器返回View("CompareItemsList",obj),Ajax拿到的是这个视图的HTML代码,但没做任何处理,所以页面看起来毫无变化。

为什么表单提交时控制器接收值为null?

你之前的表单提交代码里,只是在点击事件里定义了data.CartList = "cart_list",但根本没把localStorage里的真实JSON数据添加到表单的提交参数中,控制器的cart_list参数自然拿不到值。


方案一:修改Ajax请求,手动实现页面跳转

如果你想继续用Ajax,可以让控制器返回目标页面的URL,前端收到后主动跳转;或者直接返回视图HTML替换当前页面内容。

步骤1:调整控制器代码

把返回View改成返回包含跳转地址的Json结果:

[HttpPost]
[OutputCache(Duration = 20, VaryByParam = "none")]
public async Task<ActionResult> CompareItemsList(string cart_list, string brandList)
{
    // 你的业务逻辑代码保持不变...
    
    // 生成目标页面的跳转URL
    var redirectUrl = Url.Action("CompareItemsList", "Compare");
    return Json(new { success = true, redirectUrl = redirectUrl });
}

步骤2:修改前端Ajax逻辑

在请求成功后执行跳转:

$("#btna").click(function (evt) {
    evt.preventDefault(); // 阻止按钮默认的提交行为
    var temp = localStorage.getItem("cart");
    var value = $('#brandList option:selected').val();
    $.ajax({
        type: 'POST',
        dataType: "json",
        data: { cart_list: temp, brandList: value },
        url: '@Url.Action("CompareItemsList", "Compare")',
        success: function(response) {
            if(response.success) {
                // 跳转到目标页面
                window.location.href = response.redirectUrl;
            }
        },
        error: function(xhr) {
            // 处理错误,比如打印日志或提示用户
            console.error("请求出错:", xhr.responseText);
        }
    });
});

方案二:修复表单提交,把localStorage数据加入表单

既然你需要整页跳转,其实表单提交更适配这个场景,只需要在表单里加个隐藏字段,提交前把localStorage的数据赋值进去就行。

步骤1:修改表单代码

添加一个hidden类型的input,命名为cart_list(和控制器参数名一致):

@using (Html.BeginForm("CompareItemsList", "Compare", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    <div id="smartcart" hidden></div>
    <!-- 新增隐藏字段存储localStorage数据 -->
    <input type="hidden" name="cart_list" id="cart_list" />
    <div class="col-md-6">
        <select name="brandList" id="brandList" class="form-control">
            @foreach (var item in Model.Subbrands)
            {
                foreach (var item2 in Model.selectedBrands)
                {
                    if (item.Title != item2)
                    {
                        <option>@item.Title</option>
                    }
                }
            }
        </select>
    </div>
    <div class="col-xs-1">
        <button type="submit" command="submit" class="btn btn-success" id="btna" value="compare">
            Compare with this brand
        </button>
    </div>
    <script>
        $("#btna").click(function (evt) {
            // 把localStorage里的cart数据赋值给隐藏字段
            $("#cart_list").val(localStorage.getItem("cart"));
            // 不用阻止默认行为,表单会正常提交并跳转
        });
    </script>
}

步骤2:控制器代码保持不变

原来的控制器代码可以直接接收cart_list参数,因为表单提交时会把隐藏字段的值一起传过去。


为什么模态框里的类似功能能正常运行?

大概率是模态框里的提交逻辑要么是同步表单提交(自然触发页面跳转),要么是Ajax请求后手动处理了页面更新/跳转,和你当前的代码逻辑不一样。

推荐优先选方案二,因为表单提交更贴合整页跳转的场景,代码也更简洁直观。

内容的提问来源于stack exchange,提问作者Razban

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:30:42