【问题标题】:Controller must either provide JsonResult or redirect to view控制器必须提供 JsonResult 或重定向到视图
【发布时间】:2011-04-07 10:47:47
【问题描述】:

我有一个带有标准提交的 ExtJs 表单面板:false。提交时,控制器将验证表单数据,因为某些验证将在服务器上进行(例如检查名称是否唯一)。如果提供的实体无效,则会向客户端发送一个 JsonResult 以通知用户哪些字段无效。这完美无缺。如果实体有效,它将存储在数据库中,控制器必须将用户重定向到特定视图。

结果是视图提供的 HTML 被发送到期望 JSON 响应的客户端。显然,这是行不通的。

public override ActionResult Create(FormCollection formCollection)
    {
        Models.Relatie relatie = Repository.CreateNew();
        SetFormValues(relatie, formCollection);

        if (ModelState.IsValid)
        {
            _relatieService.CreateRelation(relatie);
            ViewResult view = View("Index");
            return view; //pumps html while client expects JSON
        }
        else
        {
            JsonResult json = Json(new { success = false, errors = ModelState.ToDictionary() });
            return json;
        }
    }

我一直在寻找解决方案超过 8 小时,有人可以帮助我吗?

【问题讨论】:

    标签: asp.net-mvc json extjs


    【解决方案1】:

    发回一个将 success 属性设置为 true 的 JSON 对象。在 AJAX 调用的成功处理程序中检查这一点,并使用 javascript ( window.location = indexLink) 进行重定向。

    值得注意的是,如果您想在服务器端生成链接并且您正在使用 Web 表单视图引擎,则需要执行以下操作以在页面中嵌入脚本变量:

    <%= "<script language=\"javascript\"> var indexLink = \"" + Url.Action("Index") + "\";</script>" %>
    

    然后您可以在您的页面中使用indexLink

    【讨论】:

    • 谢谢,这个想法行得通!我实际上已经在 J​​sonResponse 对象中提供了重定向链接,因此它将在服务器上确定。对 MVC 范式的一个非常小的违反,但我可以接受。它看起来仍然很干净。
    • 有点,但 IMO AJAX 不应该真正用于控制 MVC 应用程序中的应用程序流。同样,Create 视图应该真正重定向到 Index 而不是返回 HTML。
    • 确保 javascript 重定向使用 href 属性使其在所有浏览器中都能正常工作。例如。 window.location.href = indexLink
    猜你喜欢
    • 2011-02-04
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 2012-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多