【发布时间】: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