【问题标题】:How to return JSON Result in MVC2 at Post如何在 MVC2 中在 Post 中返回 JSON 结果
【发布时间】:2011-10-06 15:01:50
【问题描述】:

我正在使用 ajax post 方法来发布表单,例如:-

$(函数 () {

        $('#BtnName').submit(function () {
            $.ajax({
                url: 'Home/Index',
                type: "POST",
                data: $(this).serialize(),
                dataType: "json",
                async:false,
                contentType: 'application/json; charset=utf-8',
                success: function (data) { var message = data.Result; $("#Result").html(message); },
               

            });
            return false;
        });
    });

在我正在返回的动作控制器处

return Json(new { Result = "Success" }, JsonRequestBehavior.AllowGet);

我无法在 div 中获得结果;而不是将整个渲染页面作为完整文件返回。请告诉我应该怎么做才能在页面上显示结果并且还想在同一页面上而不清除表单。

【问题讨论】:

  • 显示所有控制器代码。
  • 我只是在数据库中插入值,并在控制器末尾使用 return Json(new { Result = "Success" }, JsonRequestBehavior.AllowGet);
  • 您在 ajax 方法中调用 home/index。你确定它与返回 json 的方法相同吗?
  • 是的,该方法将 JsonResult 作为公共 JsonResult 索引(FormCollection frm)返回
  • 如果你的POST'ing 到你的操作方法,你为什么需要JsonRequestBehavior.AllowGet?你不需要那个。 Fiddler 显示从 HTTP POST 返回的内容是什么?

标签: c# jquery asp.net-mvc model-view-controller asp.net-mvc-2


【解决方案1】:

好的,您问题中包含的代码位绝对不足以得出任何结论。所以让我们做一个完整的例子。

型号:

public class MyViewModel
{
    public string Foo { get; set; }
}

控制器:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View(new MyViewModel());
    }

    [HttpPost]
    public ActionResult Index(MyViewModel model)
    {
        // TODO : process the model ...

        return Json(new { Result = "Success" });
    }
}

查看:

<% using (Html.BeginForm(null, null, FormMethod.Post, new { id = "myForm" })) { %>
    <%= Html.LabelFor(x => x.Foo) %>
    <%= Html.EditorFor(x => x.Foo) %>
    <input type="submit" value="Save" />
<% } %>

外部 javascript 不显眼地 AJAXify 表单:

$(function () {
    $('#myForm').submit(function () {
        $.ajax({
            url: this.action,
            type: this.method,
            data: $(this).serialize(),
            success: function (data) {
                var message = data.Result; 
                $('#Result').html(message);
            }
        });
        return false;
    });
});

注意事项:

  • 我将.submit 事件附加到表单的if (#myForm),而在您的示例中,您使用的是#BtnName,它看起来是一个奇怪可疑的表单名称。很遗憾,您没有显示您的标记,所以我们不知道它实际代表什么
  • 我不再对表单 (Home/Index) 的 URL 进行硬编码,而是依赖于由 Html.BeginForm 生成的 URL。这样做有两个好处:1. 您现在可以将您的 javascript 放入一个单独的文件 => 您不再混合标记和脚本,您的 HTML 页面现在变得更小更快加载(外部静态 javascript 文件被缓存)和 2 . 当您在其他服务器上部署应用程序或决定更改路由时,它仍然可以工作,无需对您的 js 进行任何修改。
  • 我不再使用contentType: 'application/json',因为当您使用$(this).serialize() 时,这不会将表单序列化为JSON。它将其序列化为application/x-www-form-urlencoded 样式。所以你基本上是在引入一个矛盾: 您是在告诉服务器您将发送 JSON 请求,但实际上您不会。
  • 我删除了async: false 属性,因为它会执行同步请求并在执行期间冻结浏览器。它不再是 AJAX。所以除非你想要这个,否则不要使用它。
  • 我已经删除了dataType: 'json' 参数,因为jQuery 足够智能,可以从实际响应Content-Type 标头中推断出这一点,并自动解析返回的JSON 并将其作为可以直接使用的javascript 对象传递给成功回调。

【讨论】:

  • 这也适用于 .post() 吗?以及如何处理错误,例如所有返回的结果都是成功的(至少我有时经历过),因为在控制器中我必须正确返回,假设模型无效,我要返回什么那么呢?
  • @Dejan.S,有很多方法,没有单一的答案。一切都取决于您的确切情况以及您要实现的目标。一种方法是将这个表单放入一个部分中,并让控制器操作在验证错误的情况下返回这个部分(以便有错误的字段可以用红色突出显示)并且在成功的情况下返回 JSON。然后在 AJAX 成功回调中,您可以检查返回的结果是否为 JSON 对象,如果不是,则将新的部分注入 DOM 以便显示错误。还有其他更多使用响应 HTTP 状态代码的 RESTful 方式。
  • 我有一个场景,但我没有在这里得到代码,我会提出一个新问题,也许你会回答它:),但我明白你对部分的意思,那是我的一个想法。谢谢回复
  • 这是显示错误消息 Microsoft JScript 运行时错误:Sys.WebForms.PageRequestManagerParserErrorException:无法解析从服务器接收到的消息。此错误的常见原因是通过调用 Response.Write()、响应过滤器、HttpModules 或启用了服务器跟踪来修改响应。详细信息:在 '{"Result":"Success"}' 附近解析出错。
猜你喜欢
  • 2012-05-14
  • 1970-01-01
  • 1970-01-01
  • 2023-01-24
  • 2016-06-15
  • 2014-04-21
  • 2020-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多