我遇到一个问题,在我从控制器返回View后,我的浏览器中弹出了一个模态窗口。这是窗口所说的内容(在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的新手并完成了一些教程,但我之前从未遇到过这种行为。我以为我必须处理来自控制器的回调,但到目前为止我所有的搜索都没有产生任何结果。我希望来自这个优秀社区的人能指出我正确的方向。
感谢您抽出宝贵时间阅读!
答案 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;来自回应的字段。
这对我有用。谢谢大家的意见,我希望我的问题可以帮助其他人。