Javascript 如何使用Knockout.js将下拉列表中的选定项自动更新到SignalR中所有连接的客户端?
已解决: 添加新的已更正代码行,并对旧代码行进行注释 对于使用signar的实时应用程序,我希望用户所做的更改能够被所有连接的客户端实时看到 使用一个简单的文本框是可以的,但是当我使用下拉列表时:当用户选择一个项目时,我希望从下拉列表中选择的项目自动设置为自动更新到所有连接的客户端 Knockout.js似乎是一个明显的选择,但我想我在订阅方面有一个问题。。。还是其他地方 我所拥有的: ASP.NET Razor下拉列表: 生成以下内容的HTML:Javascript 如何使用Knockout.js将下拉列表中的选定项自动更新到SignalR中所有连接的客户端?,javascript,data-binding,asp.net-mvc-4,knockout.js,signalr,Javascript,Data Binding,Asp.net Mvc 4,Knockout.js,Signalr,已解决: 添加新的已更正代码行,并对旧代码行进行注释 对于使用signar的实时应用程序,我希望用户所做的更改能够被所有连接的客户端实时看到 使用一个简单的文本框是可以的,但是当我使用下拉列表时:当用户选择一个项目时,我希望从下拉列表中选择的项目自动设置为自动更新到所有连接的客户端 Knockout.js似乎是一个明显的选择,但我想我在订阅方面有一个问题。。。还是其他地方 我所拥有的: ASP.NET Razor下拉列表: 生成以下内容的HTML: //<select class="ui-
//<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函数,该函数使用指定对象从服务器端调用函数:
this.updateTask = function (task)
{
if (notify)
this.hub.server.s_Update(task);
}
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;
}
}
}
服务器端的C函数,用于修改数据库中的值,并从客户端调用具有指定对象的所有已连接客户端的函数:
this.updateTask = function (task)
{
if (notify)
this.hub.server.s_Update(task);
}
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函数,该函数应更新接口:
如果我没有弄错,您的道具在客户端称为selectedResponsible\u UserId,在服务器端称为Responsible\u UserId。看起来这一潜在的不匹配导致了您的问题。请,无论是谁否决了这个问题,我都要求证明他/她的行为是正确的,以改进它!!谢谢。如果我没有弄错,您的道具在客户端称为selectedResponsible_UserId,在服务器端称为Responsible_UserId。我看不到任何地方能将它映射到不同的东西。@RPNiemeyer谢谢,你是对的!我将属性名称从客户端selectedResponsible_UserId更改为Responsible_UserId,所有操作都非常有效!移动到“回答”,以便关闭此问题。很高兴您的问题得到了简单的解决!
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;
};