绑定SignalR,SignalR 2.0的用户ID提供程序和knockout.js视图一起进行实时数据更新

时间:2014-02-13 07:19:50

标签: c# knockout.js signalr signalr-hub

除了安全问题,因为这是另一个话题。

说,我有以下客户端实现,它利用knockout.js observablescomputed observables

// Define the global 'app' object
var app = {
    data: {
        userProfile: ko.observable()
    }
}

// Define the viewModel and subscribe to the app.data.userProfile() changes
var viewModel = {
    profile: ko.computed(function(){ return app.data.userProfile(); });
}

// Establish the hub connection
var profileHub = $.connection.profileHub;

// Define the client method
profileHub.client.userProfile = function (profile) {
    app.data.userProfile(profile);
};

// Start the hub
$.connection.hub.start().done(function () {
    // Bind the viewModel to the view
    ko.applyBindings(viewModel);
});

在此之后,如果我使用SignalR 2.0的用户ID提供程序,我应该可以从我的集线器中调用以下内容。

public class ProfileHub : Hub
{
    public void UserProfile(UserProfile profile)
    {
        Clients.User(profile.userId).send(profile);
    }
}

有效地将更新的信息绑定到用户的视图。


在此过程中,用户将更新后的个人资料提交给服务器(详细信息省略),最后我们将其存储到后端


假设我有以下C#代码将信息保存到BLL中的后端。

MyDal.Instance.UpdateProfile(profile, DalSuccessAction, DalFailureAction);

DalSuccessAction如下:

protected void DalSuccessAction(IEntity entity){

    // Handle caching through the interface
    entity.ToCache();

    if (entity is UserProfile) {
        // Should I call the Hub directly here or is there a better way (design-wise) going about it?
    }

}

2 个答案:

答案 0 :(得分:0)

您必须将绑定应用于某些,即您的VM;淘汰赛无法猜出它是什么

// Start the hub
$.connection.hub.start().done(function () {
    // Bind the viewModel to the view
    ko.applyBindings(viewModel);
});

答案 1 :(得分:0)

我建议您将图层逻辑分开。这意味着MVC应该是处理客户端调用而不是BLL或DAL的应用程序。

您可以通过将UpdateProfile方法的结果返回到控制器/集线器等来实现此目的。(如果需要,可以将其转换为ViewModel对象)。