MVC3 Ajax ActionLink在使用TempData完成时调用javascript函数

时间:2012-08-28 20:18:50

标签: javascript ajax json asp.net-mvc-3

我一直试图在用户调用控制器中的操作时收到通知。这适用于我的大多数操作,但是我使用Ajax.ActionLink来删除我的项目,因此页面没有刷新,并且没有调用javascript函数,因此通知没有显示。

在我的_Layout页面中,我有如下所示的通知系统:

<script type="text/javascript">
    //Used to display and close the system notifications
    $(document).ready(function notify() {
        $("#NotificationBox").show("slide", { direction: "down" }, 1000);
        if ($("#NotificationAutoHide").val() == "true") {
            $("#NotificationBox").delay(5000).hide("slide", { direction: "down" }, 1000);
        }
    });
</script>

<div id="NotificationDiv">
    @if (TempData["Notification"] != null)
    { 
        @Html.Hidden("NotificationAutoHide", TempData["NotificationAutoHide"])
        <div id="NotificationBox" class="@TempData["NotificationCSS"]" style="display: none">
             @TempData["Notification"]
        </div>
    }
</div>

在我的Index视图(使用布局页面)中,我有Ajax ActionLink在我的控制器中调用我的Delete操作,该操作还会填充所需的TempData属性

@Ajax.ActionLink("Delete", "Delete", "MyController",
    new { id = item.UserID },
    new AjaxOptions {
        HttpMethod = "Delete",
        OnBegin = "JSONDeleteFile_OnBegin",
        OnComplete = "notify"
    },
    new { @class = "delete-link" })

我想通过在notify中的OnComplete选项中添加对ActionLink函数的调用,然后一切都会起作用,但不幸的是,这似乎不起作用。

我已经看到一些示例建议从我的控制器中通过TempData发送JsonResult,但是我不确定如何将其与现有代码联系起来。 (我的控制器已经返回一个JsonResult对象用于其他用途)

有人可以帮助我从Ajax电话回来TempData并执行我的通知系统吗?

非常感谢你的时间。

2 个答案:

答案 0 :(得分:0)

由于TempData是服务器端代码,我认为不可能。您应该通过JsonResult返回此信息。

示例:

public JsonResult Delete(int id)
{
  //do stuff
  return Json(new {param1 = "what you need", param2 = "more info"}, JsonRequestBehavior.AllowGet);
}

答案 1 :(得分:0)

确保您的notify函数是公开可见的,以便您可以从AJAX成功回调中调用它:

<script type="text/javascript">
    function notify() {
        $("#NotificationBox").show("slide", { direction: "down" }, 1000);
        if ($("#NotificationAutoHide").val() == "true") {
            $("#NotificationBox").delay(5000).hide("slide", { direction: "down" }, 1000);
        }
    }

    $(document).ready(notify);
</script>

您声明notify函数的方式使得无法从外部范围调用此函数:

$(document).ready(function notify() { ... });

我甚至不知道这是否是有效的javascript语法。从未见过有人使用它。