MVC5防止模式窗口从控制器返回时弹出

时间:2017-03-20 12:10:58

标签: javascript c# asp.net-mvc

我遇到一个问题,在我从控制器返回View后,我的浏览器中弹出了一个模态窗口。这是窗口所说的内容(在Chrome中):

Modal window pop up text

它包含来自Index.cshtml页面的html代码。

以下是我的控制器中的代码:

public ActionResult Save(Events changedEvent,FormCollection actionValues)
        {
            string action_type = actionValues["!nativeeditor_status"];

            var eventText = actionValues["text"];
            var eventStart = actionValues["start_date"];
            var eventEnd = actionValues["end_date"];

            try
            {
                switch (action_type)
                {
                    case "inserted":
                        if (User.IsInRole("Admin"))
                            db.Event.Add(changedEvent);                    
                        Send(eventText, eventStart, eventEnd);
                        break;

                    case "deleted":
                        //changedEvent = db.Event.SingleOrDefault(ev => ev.Id == source_id);
                        changedEvent = db.Event.SingleOrDefault(ev => ev.text == eventText);
                        db.Event.Remove(changedEvent);
                        break;

                    default: // update
                        //changedEvent = db.Event.SingleOrDefault(ev => ev.Id == source_id);
                        changedEvent = db.Event.SingleOrDefault(ev => ev.text == eventText);
                        UpdateModel(changedEvent);
                        break;
                }

                db.SaveChanges();

            }
            catch (Exception)
            {

                action_type = "error";
            }

            return RedirectToAction("Index", "Home");
        }

以下是我的Index.cshtml页面中处理保存到数据库的代码:

function init() { 
  var dp = new dataProcessor("/Home/Save");
        dp.init(scheduler);
        dp.setTransactionMode("POST", false);
    }

我仍然是MVC的新手并完成了一些教程,但我之前从未遇到过这种行为。我以为我必须处理来自控制器的回调,但到目前为止我所有的搜索都没有产生任何结果。我希望来自这个优秀社区的人能指出我正确的方向。

感谢您抽出宝贵时间阅读!

2 个答案:

答案 0 :(得分:0)

如果您正在使用AJAX请求(您的dataProcessor在内部发出AJAX POST请求),您将无法从C#控制器重定向。

您有两种选择:

1)不要使用您的dataProcessor,并使用默认的C#MVC绑定向服务器发出请求,如下所示:https://stackoverflow.com/a/7856996/3638529。使用此方法,您将能够返回RedirectToAction()并且将正确返回用户,但这可能会大大改变您的基础结构。

2)更改您的控制器以返回要重定向的网址。 首先更改您的保存方法以返回如下内容:

public ActionResult Save(Events changedEvent,FormCollection actionValues)
{
    ...
    return Json(new {success = true, url = Url.Action("Index", "Home")});
}

然后在AJAX请求完成时更改您的JavaScript方法以生成类似的内容:

function myAwesomeSuccessCallback(response) {
  if (response.success) {
     window.location = response.url;
  }
  else {
      //show error
  }
}

答案 1 :(得分:0)

我发布在dhtmlx论坛上,我能够从他们的支持人员那里获得解决方案。我在下面完整地发布了他的答案:

您好, 这是你的代码中发生的事情 1)当您在调度程序中更改某些内容(例如,创建/删除/修改事件)时,调度程序将POST请求发送到Home / Save,如init()函数()中的dataProcessor中所定义 2)dataProcessor发送post请求并期望服务器响应匹配某种格式的json或xml https://docs.dhtmlx.com/dataprocessor__ ... nsedetails 3)您的保存操作输出html页面而不是预期的响应,此行: return RedirectToAction(" Index"," Home"); 4)客户端无法将其解析为有效响应并弹出消息。

为了解决问题,您需要从“保存”操作返回有效响应,可以通过替换当前响应来完成 - 返回 代码:全部选择

    RedirectToAction("Index", "Home"); //with this:
      return Content(
        new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(
            new System.Collections.Generic.Dictionary<string, string>
            {
                {"action", action_type},
                {"tid", eventId}
            }
        )
    );

   // will send response like this {"action":"updated", "tid":"5"} - which is valid response

请注意&#34; tid&#34; - eventId部分,如果将​​事件插入到db中 - 您必须将新数据库事件发送回客户端。如果是其他任何操作 - 您可以返回来自客户端的相同ID,也可以省略&#34; tid&#34;来自回应的字段。

这对我有用。谢谢大家的意见,我希望我的问题可以帮助其他人。