在AJAX发布后查看没有刷新

时间:2013-07-19 09:23:23

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

我有一个带有图像链接的网格(Infragistics JQuery网格)的视图(Index.cshtml)。如果用户单击此链接,将调用以下jquery函数:

function ConfirmSettingEnddateRemarkToYesterday(remarkID) {

    //Some code...

    //Call to action.
$.post("Home/SetEnddateRemarkToYesterday", { remarkID: remarkID },  function (result) {
    //alert('Succes: ' + remarkID);
    //window.location.reload();
    //$('#remarksgrid').html(result);
});

}

注释掉你可以看到我自己的警报和2次刷新视图的尝试。 location.reload()有效,但对于浏览器来说基本上是太多了。 .html(result)在remarksgrid div中发布整个index.cshtml + Layout.cshtml double。所以这是不正确的。

这是它调用的动作(SetEnddateRemarkToY yesterday):

       public ActionResult SetEnddateRemarkToYesterday(int remarkID) {

        //Some logic to persist the change to DB.

        return RedirectToAction("Index");
    }

这是重定向到的行为:

[HttpGet]
public ActionResult Index() {
    //Some code to retrieve updated remarks. 
    //Remarks is pseudo for List<Of Remark>
    return View(Remarks);

}

如果我在成功的AJAX帖子之后没有执行window.location.reload,那么视图将永远不会重新加载。我是MVC的新手,但我确信有更好的方法可以做到这一点。我不是在理解一些基本的东西。也许正朝着正确的方向推进?提前谢谢。

4 个答案:

答案 0 :(得分:18)

当您请求AJAX调用时,您应该使用其响应重定向

修改您的控制器以使用登陆网址返回JSONResult:

public ActionResult SetEnddateRemarkToYesterday(int remarkID) {
    //Some logic to persist the change to DB.
    var redirectUrl = new UrlHelper(Request.RequestContext).Action("Index", "Controller");
        return Json(new { Url = redirectUrl });
}

JS Call:

$.post("Home/SetEnddateRemarkToYesterday", { remarkID: remarkID },  function (result) {
    window.location.href = result.Url
});

答案 1 :(得分:4)

在Ajax发布后,您需要调用特定的Url .. 像这样.. window.location.href = Url

答案 2 :(得分:0)

使用 jQuery.post 时,会通过 .done 方法返回新页面

jQuery的

jQuery.post("Controller/Action", { d1: "test", d2: "test" })
  .done(function (data) {
      jQuery('#reload').html(data);
  });

HTML

<body id="reload">

答案 3 :(得分:0)

对我来说这是有效的。首先,我在表单中创建了 id="reload",然后使用 Colin 提供的解决方案并使用 Ajax 将数据发送到控制器并刷新了我的表单。

这看起来是我的控制器:

[Authorize(Roles = "User")]
[HttpGet]
public IActionResult Action()
{
    var model = _service.Get()...;
    return View(model);
}

[Authorize(Roles = "User")]
[HttpPost]
public IActionResult Action(object someData)
{

    var model = _service.Get()...;

    return View(model);
}

查看:

<form id="reload" asp-action="Action" asp-controller="Controller" method="post">
    .
    .
    .
</form>

Javascript 函数,在这个函数中我添加了这个块:

$.ajax({
    url: "/Controller/Action",
    type: 'POST',
    data: {
        __RequestVerificationToken: token, // if you are using identity User
        someData: someData
    },
    success: function (data) {
        console.log("Success")
        console.log(data);
        var parser = new DOMParser();
        var htmlDoc = parser.parseFromString(data, 'text/html'); // parse result (type string format HTML)
        console.log(htmlDoc);
        var form = htmlDoc.getElementById('reload'); // get my form to refresh
        console.log(form);
        jQuery('#reload').html(form); // refresh form
    },
    error: function (error) {
        console.log("error is " + error);
    }
});