【问题标题】:Change View via JQuery POST while passing model data在传递模型数据时通过 JQuery POST 更改视图
【发布时间】:2014-09-16 17:18:54
【问题描述】:

我正在为我们的搜索索引开发一个内部测试网站,我希望在所有数据都输入并提交到搜索查询页面后,将该页面重定向到搜索结果页面。在我收到这项任务之前,我也从未实现过网站(除了基本的 HTML)。无论如何,我已经取得了很好的进展(遇到了一些令人沮丧的障碍),但是考虑到我现在拥有的工具,这似乎是不可能的,尽管它不应该是。

我有一个复杂对象数组 (QueryDataModel),我将它们传递给控制器​​,因为它告诉服务器哪些搜索在哪里以及使用哪些参数运行。这些参数和服务器数据由 Javascript 从页面上的表单中收集。 $.ajax 发布该数据我没有任何问题,但问题是如果我使用 $.ajax,我无法立即将用户重定向到新页面。

然后我发现我可以使用非 AJAX POST 来立即重定向用户,但我似乎不可能以这种方式传递如此复杂的参数; jQuery 中没有任何支持良好的函数来执行非 AJAX POST。流行的方法似乎是设置一个假表单,然后使用您要传递的参数填充其输入,这似乎不适用于我拥有的对象。

现在我已经将它设置为进行重定向操作,因为我阅读了 MSDN 上 RedirectToAction 的描述,并认为它实际上会强制浏览器更改页面......唉,它没有。

那么,如何将一组复杂对象传递给控制器​​以用作新视图的模型,然后将用户重定向到该新视图?

控制器动作:

public ActionResult Results()
    {
        ViewData["MrSIXGTs"] = MvcApplication.MrSixGts;
        ViewData["MrSIXs"] = MvcApplication.MrSixs;
        return View(MixedSearch(TempData["qdm"] as QueryDataModel[]));
    }

    public ActionResult RedirectResults(QueryDataModel[] qd)
    {
        TempData["qdm"] = qd;
        return RedirectToAction("Results", "Search");
    }

相关的Javascript(包括我已经尝试过的注释掉的方法):

var qdm = [];
    $('#search-list > .search-form').each(function() {
        var formwrapper = this;
        var servs = [];
        var c = 0;
        $('#' + $(formwrapper).attr('id') + ' > .server-checkbox:checked').each(function () {
            servs.push($(this).attr('name'));
            c++;
        });
        $('#' + $(formwrapper).attr('id') + ' > .form-wrapper > form').each(function() { // only one iteration; not really a loop
            var z = new QueryDataModel($(this).parent().attr('id'), servs, $(this).serializeArray(), {});
            qdm.push(z);
        });
    });
//$.doPost('/Search/RedirectResults', { qd: qdm }); // fake form function
    var str = $.param(qdm);
    alert(str);
    document.location = baseUrl + '/Search/RedirectResults' + '?' + str; // doesn't serialize properly due to the complexity
    /*
    $.ajax({ // doesn't redirect the user
            type: 'POST',
            contentType: 'application/json',
            url: '/Search/RedirectResults',
            data: $.toJSON(qdm),
            success: function () {
                //alert(baseUrl + '/Search/Results');
                //window.location.href = baseUrl + '/Search/Results';
            },
            error: function(e, t, n) {
                alert(t + ": " + n);
            }
    });*/
function QueryDataModel(sn, serv, fd, fc) {
    this.SearchName = sn;
    this.Servers = serv;
    this.InputParams = fc;
    this.FormData = $.toJSON(fd); // easier to deserialize this stuff server-side into InputParams
}

【问题讨论】:

  • 为什么不直接使用将字段发布到控制器并在那里处理数据的表单?如果您尝试立即重定向,则根本不需要使用 ajax。
  • 这是一个复杂的页面。我决定这样做,以便我可以动态地从页面中添加和删除表单。每个单独的搜索表单都有一个提交按钮和一个全部提交按钮。我在这里测试提交所有按钮,所以我必须截取所有表单数据,将其组合成一个模型,然后将其发送给控制器。
  • 可以提交一个包含一个字段的表单,该字段不过是 json 字符串化对象。尽管如此,在 ajax 成功中显示加载指示器和重定向也不可怕
  • @charlietfl 呼……有时我觉得在开发这个极其复杂的网站时需要检查的东西太多了。我觉得我应该得到那个,但我没有。如果您检查 cmets,我实际上已经接近了($.doPost 完全符合您的描述,但我使用 {qd: qdm} 而不是 {qd: JSON.stringify(qdm)})请将此作为答案发布,以便我给您应得的。

标签: jquery asp.net-mvc


【解决方案1】:

最简单的方法可能是发布一个简单的输入表单,您可以在其中 JSON.stringify 您的大对象作为值

【讨论】:

    猜你喜欢
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多