在MVC Asp.net中呈现部分视图后,是否可以启动javascript函数?

时间:2013-01-22 23:38:44

标签: c# asp.net-mvc devexpress asp.net-mvc-partialview

让我先说明这个问题,因为我对MVC很新。

我有一个实例,我在局部视图中渲染一个devexpress网格。

@Html.Partial("MyGridPartial", Model)

我需要在通过此局部视图渲染填充模型时启动javascript函数。我试图通过这个做到这一点。 :

settings.ClientSideEvents.EndCallback

我可以达到这一点,但当时我没有填充模型本身,所以它没有用。我想知道是否有人知道踢到/附加到局部视图渲染的通用方法,以便跳转到一些客户端javascript代码。

2 个答案:

答案 0 :(得分:7)

如果它是一个PartialView,那么你就可以在一个视图中渲染,而Dave的方法最好。只需将您的代码连接到DOM就绪事件。

$(document).ready(function(){
    //Javascript logic to fire goes here
});

或者如果您保留速记版本......

$(function(){
    //Javascript logic to fire goes here
});

如果您正在渲染通过Ajax加载的局部视图,那么相同的方法将起作用。如果我正确地回忆起来的话,jQuery将在html中运行javascript,一旦它附加到DOM,就会通过Ajax传回给客户端(随意测试一下我只是通过内存关于它一旦附加到DOM就解雇它,但我相信这一点是load()方法的一个特性,假设您要运行的javascript位于响应中。如果它在发送Ajax请求的父页面中,那么最好的办法就是将它连接到完整的事件。 (我在这里填写客户端参数)

$("#wrapperAwaitingContent").load("/Grids/MyGridPartial", {id: null /*parameters*/}, function(text, status, xhr){
    //Javascript logic to fire goes here
});

对我来说,使用服务器上的UrlHelper解析.load()来电中使用的网址

$("#wrapperAwaitingContent").load("@Url.Action("MyGridPartial", "Grids")", {id: null /*parameters*/}, function(text, status, xhr){
    //Javascript logic to fire goes here
});

您还可以选择使用Unobtrusive Ajax执行与此类似的操作。 (我在这里填充服务器端的参数)

@Ajax.ActionLink("Load Data", "MyGridPartial", "Grids", new { id = null/*parameters*/ }, new AjaxOptions() { UpdateTargetId = "wrapperAwaitingContent", OnComplete="onCompleteMethodName" })

除了接收HTML的元素和完成时调用的方法之外,您可以为AjaxOptions设置更多属性,但我发现我将重用在共享javascript文件中定义的函数并仅在它们是还没有从那里填充,像这样......

$("a[data-ajax='true']").each(function () {
    var ajaxUpdate = $(this).closest("data-ajax-container");
    $(this).attr("data-ajax-update", $(this).attr("data-ajax-update") ? $(this).attr("data-ajax-update") : ajaxUpdate);
    $(this).attr("data-ajax-mode", $(this).attr("data-ajax-mode") ? $(this).attr("data-ajax-mode") : "replace");
    $(this).attr("data-ajax-success", $(this).attr("data-ajax-success") ? $(this).attr("data-ajax-success") : "AjaxSuccess");
    $(this).attr("data-ajax-complete", $(this).attr("data-ajax-complete") ? $(this).attr("data-ajax-complete") : "AjaxComplete");
    $(this).attr("data-ajax-failure", $(this).attr("data-ajax-error") ? $(this).attr("data-ajax-error") : "AjaxError");
});

答案 1 :(得分:5)

如果您将此部分渲染为正在渲染的视图的正常流程的一部分,则答案为否。

原因是在甚至呈现父视图之前将Partial转换为字符串。此时,浏览器没有看到任何标记,也没有读取过jscript。

另一方面,如果您在JQuery Ready函数中渲染了部分:

$(document).ready(function() {

我认为您需要使用Action Partial(由Action方法调用的Partial)。通过引用url(restfully):

,可以在JQuery Ready函数中调用Action Partials
$('#divMyGridPartial').load('/Grids/MyGridPartial/{id}');

并且可以在就绪系列中调用任何后续的jscript / jquery函数。

动作部分的另一个优点是,模型是在动作方法中形成的,可以根据你的需要在上下文中创建(理想情况下是通过身份)。