解決済み:
修正された新しいコード行を追加し、古い行にコメントを付けました。
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>
(JavaScript)ViewModel:
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;
};