我正在努力实现以下目标,我有一个用户登录呼叫的页面,用户需要输入各种字段并从几个下拉列表中选择,然后我需要发布该数据(通过JQuery或控制器) )到另一个页面,用户可以在其中查看输入的数据并决定是否提交。
我现在已经回去了很多年,试图弄清楚如何将数据从我的cshtml发布到我的控制器,然后重定向到另一个页面并保持这些数据。
我试图通过JQuery和/或控制器进行重定向,但似乎无法让其中一个工作。
以下代码摘录:
CSHTML:
$.ajax({
url: dir + '/Submit/',
async: true,
type: 'POST',
data: JSON.stringify(callData),
contentType: 'application/json; charset=utf-8',
complete: function () { },
success: function (data) {
}
})
控制器:
[HttpPost]
public ActionResult Submit(SupportCallModel callData)
{
SupportCallModel newData = new SupportCallModel();
newData.SupportCallID = 1;
newData.CallTypeID = callData.CallTypeID;
newData.TroubleShooting = callData.TroubleShooting;
newData.EmailRequest = callData.EmailRequest;
newData.MailDate = callData.MailDate;
newData.FSEOnSite = callData.FSEOnSite;
newData.FSEEmployeeID = callData.FSEEmployeeID;
newData.CallCategory = callData.CallCategory;
newData.CallType = callData.CallType;
newData.CallItem = callData.CallItem;
newData.Summary = callData.Summary;
newData.Description = callData.Description;
newData.ExternalReference = callData.ExternalReference;
newData.CallStatusID = callData.CallStatusID;
newData.CallPriorityID = callData.CallPriorityID;
newData.CallCoEmployeeID = callData.CallCoEmployeeID;
return RedirectToAction("Verify", newData);
}
public ActionResult Verify(SupportCallModel postData)
{
return View(postData);
}
答案 0 :(得分:0)
在你的网址中......
$.ajax({
url: '@Url.Action("Submit","{ControllerName}")',
async: true,
type: 'POST',
data: JSON.stringify(callData),
contentType: 'application/json; charset=utf-8',
complete: function () { },
success: function (data) {
window.location.href = '@Url.Action("Verify","{ControllerName}", Model);'
}
})
答案 1 :(得分:0)
它无效,因为当您通过AJAX拨打电话时,您在服务器端重定向。
您的重定向应该在客户端进行,因为您在非传统意义上调用ActionResult
(AJAX)。
您可以从操作结果中删除return RedirectToAction("Verify", newData);
,因为它不会执行任何操作。您可以返回指定调用是否有效的内容。
要使您的数据在另一个页面上保留,您必须将数据保存到数据库中的临时表中,以便在进行重定向时显示它。
$.ajax({
url: dir + '/Submit/',
async: true,
type: 'POST',
data: JSON.stringify(callData),
contentType: 'application/json; charset=utf-8',
complete: function () {
},
success: function (data) {
if (data && data.isValid) {
// Grab the tempId that was saved temporarily for verification.
var tempId = data.tempId;
// Perform redirect
window.location = dir + '/Verify/' + tempId;
}
}
});
答案 2 :(得分:0)
使用ajax是没有意义的,因为ajax调用保持在同一页面上(忽略return RedirectToAction("Verify", newData);
)。你可以做一个正常的提交。假设您在视图中呈现SupportCallModel
所需的所有输入,那么它将回发。我建议你包括
[HttpPost]
public ActionResult Submit(SupportCallModel callData)
{
if (!ModelState.IsValid)
{
return View(callData);
}
...
如果模型包含验证错误,则在方法的顶部。
然后根据SupportCallModel
的属性创建callData
的新实例,这似乎毫无意义(为什么不通过callData
而不是newData
?)
如果SupportCallModel
仅包含值类型的属性,则可以使用return RedirectToAction("Verify", newData);
或return RedirectToAction("Verify", callData);
。在内部,RouteValueDictionary
基于每个属性的名称和值创建,postData
将在Verify()
方法中正确绑定。但是,如果任何属性都是复杂类型或集合,则这些属性的绑定将失败。在这种情况下,您需要保留模型,以便可以在Verify
方法中检索它。我的建议是坚持到数据库(单独的表或包含指示待处理状态的字段的现有表),但您可以使用Session
或TempData
(与{{1一起使用)如果用户点击刷新按钮,它就不会丢失。)
我不确定.Peek
GET方法的确切呈现方式,但如果它不包含所有属性的控件,那么Verify
提交按钮将需要回发一些ID值这允许您从数据库或会话中再次检索模型,最后将其保存到数据库中。
答案 3 :(得分:0)
你可以在没有Ajax的情况下使用标准表单帖子对MVC控制器进行合理简单的建模。
假设你的流程看起来像这样:
使提交POST返回包含模型中发送的数据的视图。如果可以验证该数据,则视图允许将该表单上的数据发布到Confirm控制器操作。
在此设计中,数据完全是瞬态的,然后在返回的HTML中作为表单返回在初始帖子中以HTTP表单有效负载发送的数据。然后将此数据发送到验证操作。
为了在你的情况下这样做,我认为它可能就像调用提交时使用Post动词作为无Ajax调用并修改它所以返回行看起来像return View("Verify", newData);
显然,您还需要使用Verify做一些其他操作方法。