2017-03-20 69 views
0

我遇到问题,在从控制器返回到视图后,模式窗口在我的浏览器中弹出。这里的窗口说什么(在Chrome):MVC5防止从控制器返回时弹出模式窗口

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并完成了一些教程,但我从来没有遇到过这种行为。我想我必须处理控制器的回调,但我所有的搜索都没有收到任何东西。我希望来自这个美好社区的人能够指引我走向正确的方向。

感谢您花时间阅读!

+1

搜索你的代码alert(',看起来好像有人在做js调试并忘记删除它 – Pete

+0

我从你的代码中使用Asynchronous POST(即ajax post方法)的东西,那就是响应不是原因重定向到索引页面,而是显示来自索引页面的字符串内容警报(作为@Pete注释)。 –

回答

0

我贴在DHTMLX论坛我能够从他们的一位支持人员那里获得解决方案。 1)当你在调度器中修改某些东西时(比如创建/删除/修改事件),调度器发送一个POST请求到主页。 /保存,如在init()函数()中的dataProcessor中定义的那样() 2)dataProcessor发送post请求并期望服务器响应匹配json或xml的特定格式。而不是预期的响应,这一行: 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 

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

这对我来说诀窍。谢谢大家的意见,我希望我的问题可以帮助未来的其他人。

0

如果您使用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")}); 
} 

然后改变你的JavaScript方法,使这样的事情时,你的AJAX请求完成:

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