【问题标题】:MVC5 prevent modal window from popping up when returning from controllerMVC5防止从控制器返回时弹出模态窗口
【发布时间】:2017-03-22 03:54:17
【问题描述】:

我遇到了一个问题,当我从控制器返回视图后,我的浏览器中会弹出一个模式窗口。以下是窗口显示的内容(在 Chrome 中):

它包含来自 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 还很陌生,并且已经完成了一些教程,但我以前从未遇到过这种行为。我在想我必须处理来自控制器的回调,但到目前为止我的所有搜索都没有产生任何结果。我希望来自这个优秀社区的人可以为我指明正确的方向。

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

【问题讨论】:

  • 在你的代码中搜索alert(,好像有人在做js调试忘记删除了
  • 我认为您正在使用代码中的异步 POST(即 ajax post 方法),这就是响应未重定向到索引页面的原因,而是将警报(如@Pete 评论)显示为字符串来自您的索引页的内容。

标签: javascript c# asp.net-mvc


【解决方案1】:

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

你有两个选择:

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

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

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
  }
}

【讨论】:

    【解决方案2】:

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

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

    为了解决这个问题,您需要从 Save 操作返回一个有效的响应,这可以通过替换您当前的响应来完成 - return 代码:全选

        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
    

    请注意“tid” - eventId 部分,如果您将事件插入数据库 - 您必须将新的数据库事件发送回客户端。如果是任何其他操作 - 您可以返回与来自客户端的相同 id 或从响应中省略“tid”字段。

    这对我有用。谢谢大家的cmets,我希望我的问题在未来对其他人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-17
      • 1970-01-01
      • 2011-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多