【问题标题】:How to properly render the return of AJAX POST MVC 4如何正确呈现 AJAX POST MVC 4 的返回
【发布时间】:2013-03-20 19:13:17
【问题描述】:

我正在使用 MVC 4,我正在尝试发送一个发布请求,并且我从我的控制器获得了成功的返回,结果视图采用 HTML 形式,但我不知道当时该怎么处理它.

JS

$("form").submit(function (e) {
    e.preventDefault();
    if ($(this).valid()) {
        $.ajax({
            url: submitUrl, type: "POST", traditional: true,
            data: { EventName: 'Name of event'},
            success: function(data){
                $("#content").html(data);
            }
        })
    }
});

我的控制器

[HttpPost]
public ActionResult CreateEvent(EventModel model)
{
    if(ModelState.IsValid)
    {
        return RedirectToAction("Index");
    }
    else
    {
        return View(model);
    }
}

所以你可以看到我的控制器要么返回一个视图,要么返回一个 RedirectToAction。在我的 ajax 调用的成功回调中,我正在执行以下操作: $("#content").html(data); 但似乎什么也没有发生。有人可以帮助我正确处理控制器操作的返回。

非常感谢!

【问题讨论】:

  • 您应该返回一个 JSON 示例:{"me": "its ok"} 在您的“成功”中应该解析并显示消息。
  • 您可以使用 Window.location 的 javascript 进行重定向,就像您在服务器端所做的那样。将成功标志返回给客户端,让他选择路径
  • 嗨约翰,对不起,我不太明白你的说法。我应该从我的控制器返回 Json(View(model)) 并让我的 Javascript 保持原样吗?谢谢。
  • 嗨,Devesh,我想过,但我可能需要对模型进行服务器验证并返回“视图(模型)”,所以我想查看修改后的模型。跨度>
  • 首先你要定义你要返回什么,你可以举个例子说明返回什么?

标签: javascript asp.net-mvc jquery asp.net-mvc-4


【解决方案1】:

如果我理解正确,您的页面上有一个创建事件表单,并且您想发送一个 AJAX 请求来创建一个新事件。然后,您想用 CreateEvent 操作的结果替换页面中的部分 #content

看起来您的 AJAX 设置正确,因此 CreateEvent 返回成功响应。我想你现在对回应感到困惑。你有几个选择,但让我们选择两个。

JSON 响应

[HttpPost]
public ActionResult CreateEvent(EventModel model)
{
    if(ModelState.IsValid)
    {
        var event = service.CreateEvent(model); // however you create an event
        return Json(event);
    }
    else
    {
        // model is not valid so return to original form
        return View("Index", model);
    }
    ...

现在您需要从 JSON 生成 html 标记并将其插入到#content

$.ajax({
    url: submitUrl, type: "POST", traditional: true,
    data: { EventName: 'Name of event'},
    success: function(data){
        var obj = JSON.Parse(data);
        var html; // build html with the obj containing server result
        $("#content").html(html);
    }
})

HTML片段

我们将只返回一个没有LayoutPartialView 以及所有headscript 标签,而不是返回一个完整的页面。

[HttpPost]
public ActionResult CreateEvent(EventModel model)
{
    if(ModelState.IsValid)
    {
        var event = service.CreateEvent(model); // however you create an event
        return PartialView("CreateEventResult", event);
    }
    else
    {
        // model is not valid so return to original form
        return View("Index", model);
    }
}

现在创建一个新的局部视图 CreateEventResult.cshtml (Razor)

@model Namespace.EventModelResult
@ {
    Layout = null;
}
<div>
    <!-- this stuff inserted into #content -->
    @Model.Date
    ...
</div>

并且javascript没有改变

$.ajax({
    url: submitUrl, type: "POST", traditional: true,
    data: { EventName: 'Name of event'},
    success: function(data){
        $("#content").html(data);
    }
})

编辑: 如果在验证输入后您的事件创建因任何原因失败,您必须决定如何响应。一种选择是向您返回的对象添加响应状态并仅显示该状态而不是新创建的事件。

【讨论】:

  • Jasen,感谢您提供非常有用的细分。既然你让我走上正轨,我有几个问题。我正在尝试从 MVC 处理刚刚发生的操作结果的方式转换。这意味着,如果模型创建成功,它将返回一个新链接(将用户发送到控制器的索引)或包含验证错误的模型。从你的例子看来,我需要知道我期待哪一个。有没有办法同时处理这两种情况,或者我是否认为 AJAX 用于发布模型的方式都错了?再次感谢!
  • 由于您使用 AJAX 来处理 CreateEvent,因此您不会离开原始页面——因此您只需返回结果。正在尝试做PRG
  • Jasen,是的,这就是我想要做的。我试图以某种方式利用剃刀代码,以便在返回 ajax 调用时,我可以使用已经存在的完全相同的代码来处理页面/重定向/等的刷新。我看到这是不可能进行 AJAX 调用的,我需要自己进行刷新,这实际上可能会更好,因为现在不需要重新加载页面,但我可以用返回的新 json 对象替换 html从服务器。感谢您的意见。
猜你喜欢
  • 1970-01-01
  • 2011-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-27
相关资源
最近更新 更多