1

解決済み

修正された新しいコード行を追加し、古い行にコメントを付けました。


SignalRを使用するリアルタイムアプリケーションの場合、ユーザーが行った変更を、接続されているすべてのクライアントがリアルタイムで表示できるようにする必要があります。

単純テキストボックスでも問題ありませんが、ドロップダウンリストを使用する場合:ユーザーがアイテムを選択すると、ドロップダウンから選択したアイテムが接続されているすべてのクライアントに自動的に設定(自動更新)されます。

Knockout.jsは当然の選択のようですが、サブスクライブに問題があると思います...または他の場所ですか?

私が持っているもの:

ASP .NET Razorドロップダウン

//@Html.DropDownListFor(model => model.UserProfile.UserId, (SelectList)ViewBag.DDLUsersId, "Select User", new { @class = "ui-corner-all", @data_bind="value: selectedResponsible_UserId" })

@Html.DropDownListFor(model => model.UserProfile.UserId, (SelectList)ViewBag.DDLUsersId, "Select User", new { @class = "ui-corner-all", @data_bind="value: Responsible_UserId" })

HTML)を生成します:

//<select class="ui-corner-all" data-bind="value: selectedResponsible_UserId" id="UserProfile_UserId" name="UserProfile.UserId"><option value="">Select User</option>

<select class="ui-corner-all" data-bind="value: Responsible_UserId" id="UserProfile_UserId" name="UserProfile.UserId"><option value="">Select User</option>
    <option value="1">test1</option>
    <option value="2">test2</option>
</select>

JavaScriptViewModel

function taskViewModel(id, title, Responsible_UserId, ownerViewModel)
{
    this.taskId = id;

    this.title = ko.observable(title);

    //this.selectedResponsible_UserId = ko.observable(Responsible_UserId);

    this.Responsible_UserId = ko.observable(Responsible_UserId);

    this.notification = function (b) { notify = b }

    var self = this;

    this.title.subscribe(function (newValue) 
    {
        ownerViewModel.updateTask(ko.toJS(self));
    });

    //this.selectedResponsible_UserId.subscribe(function (newValue) 

    this.Responsible_UserId.subscribe(function (newValue) 
    {
        ownerViewModel.updateTask(ko.toJS(self));
    });
}

JavaScript)指定されたオブジェクトを使用してサーバー側から関数を呼び出すクライアント側からの関数:

this.updateTask = function (task)
{    
    if (notify) 
        this.hub.server.s_Update(task);
}

C#DBの値を変更し、指定されたオブジェクトを持つすべての接続されたクライアントに対してクライアント側から関数を呼び出すサーバー側からの関数:

public bool S_Update(Task updatedTask)
{
    using (var context = new ToDoDbContext())
    {
        var oldTask = context.Tasks.FirstOrDefault(t => t.taskId == updatedTask.taskId);

        if (oldTask == null)
            return false;
        else
        {
            oldTask.title = updatedTask.title;

//??? Here, value 'updatedTask.Responsible_UserId' was NULL !!!
            oldTask.Responsible_UserId = updatedTask.Responsible_UserId;

            context.SaveChanges();

            Clients.All.C_TaskUpdated(oldTask);

            return true;
        }
    }
}

JavaScriptインターフェイスを更新する必要があるクライアント側の関数

this.hub.client.C_TaskUpdated = function (t)
{
    var task = ko.utils.arrayFilter(tasks(), function (value) { return value.taskId == t.taskId; })[0];

    notify = false;
        task.title(t.title);    

//!! obvious, here was set to NULL.     
        //task.selectedResponsible_UserId(t.Responsible_UserId);

        task.Responsible_UserId(t.Responsible_UserId);
    notify = true;
};
4

1 に答える 1

2

私がこれに正しく従えば、あなたの小道具はselectedResponsible_UserIdクライアント側とResponsible_UserIdサーバーで呼び出されます。この潜在的な不一致が問題の原因になっているようです。

于 2012-12-27T15:41:29.723 に答える