视图加载后是否可以在控制器中调用操作?

时间:2014-01-16 12:25:09

标签: c# asp.net-mvc wcf asp.net-mvc-5

我正在试图找出当我的视图加载并呈现给用户时如何在我的控制器中调用方法。我已经尝试重写OnResultExecutedOnActionExecuted,但这似乎没有办法。

protected override void OnResultExecuted(ResultExecutedContext filterContext)
{
    ConnectToDataSources();
    base.OnResultExecuted(filterContext);
}

ConnectToDataSources方法在使用SqlDependency触发实时更新的远程服务器上建立连接wcf服务。客户端我每次有变化时都使用SignalR来更新视图。如果没有数据的“实时流”,服务将返回数据库中的最后一个值。我的问题是它似乎发生得太快,以至于我的值没有正确设置。

如果我尝试使用延迟时间为1秒的计时器,那么会显示值。但是,这不是一个稳定的解决方案,所以就像我说的那样,我试图弄清楚如何在触发ConnectToDataSources方法之前等待视图完全加载。

public void ConnectToDataSources()
{
    foreach (UnitDetailsModel unit in Model.UnitDetails)
    {
        var ods = new OperationDataSource();
        var ads = new ActivityStatusDataSource();

        ads.Start(unit.UnitId, ActivityReceived, AliveReceived);
        ods.Start(DataReceived, unit.UnitId);
        _dataSources.Add(ods);
        _activityStatusDataSources.Add(ads);
    }
}

1 个答案:

答案 0 :(得分:5)

服务器不了解渲染内容然后我建议在文档准备就绪时使用AJAX请求从客户端执行此操作:

$(document).ready(function {
    $.ajax({
        type: 'GET',
        url: '/Controller/Method', // Update with proper URL
        cache: false,
        success: function(result) {
            // You may skip this if you don't expect any result
        }
    });
});

现在让我们更多地使用泛型,用服务器端生成的URL替换硬编码的URL:

url: '@Url.Action("MethodName", "ControllerName")',

当然,您甚至可以传递一些数据(AJAX请求中的data字段)。如果您不需要任何返回值,只需将您的操作方法声明为void(如果您不需要任何客户端检查以确保操作成功,则可以省略success函数。