MVC Jquery / Controller Post Redirect

时间:2014-11-04 17:00:51

标签: javascript jquery asp.net-mvc asp.net-mvc-4

我正在努力实现以下目标,我有一个用户登录呼叫的页面,用户需要输入各种字段并从几个下拉列表中选择,然后我需要发布该数据(通过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);
    }

4 个答案:

答案 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方法中检索它。我的建议是坚持到数据库(单独的表或包含指示待处理状态的字段的现有表),但您可以使用SessionTempData(与{{1一起使用)如果用户点击刷新按钮,它就不会丢失。)

我不确定.Peek GET方法的确切呈现方式,但如果它不包含所有属性的控件,那么Verify提交按钮将需要回发一些ID值这允许您从数据库或会话中再次检索模型,最后将其保存到数据库中。

答案 3 :(得分:0)

你可以在没有Ajax的情况下使用标准表单帖子对MVC控制器进行合理简单的建模。

假设你的流程看起来像这样:

Submit -> Verify process flow

使提交POST返回包含模型中发送的数据的视图。如果可以验证该数据,则视图允许将该表单上的数据发布到Confirm控制器操作。

在此设计中,数据完全是瞬态的,然后在返回的HTML中作为表单返回在初始帖子中以HTTP表单有效负载发送的数据。然后将此数据发送到验证操作。

为了在你的情况下这样做,我认为它可能就像调用提交时使用Post动词作为无Ajax调用并修改它所以返回行看起来像return View("Verify", newData);

一样简单

显然,您还需要使用Verify做一些其他操作方法。