我使用 signalR 编写了一个聊天应用程序。它是一个包含标记和运行聊天的 javascript 的 ASCX 控件。包含用户控件的页面有一个更新面板,它呈现异步并允许用户刷新某些特定于输入代码的内容。问题是,我可以多次单击刷新按钮,页面的行为没有任何问题。当我单击以连接聊天(全部在 JavaScript 中构建)并单击几次刷新按钮时,它似乎表现良好,但突然页面刹车并记录了一些视图状态错误,说:状态信息对此无效页面,可能已损坏。无效的视图状态..等等等等......这是一个丑陋的错误。
这只发生在我连接到集线器时。如果我不启动连接,这永远不会发生。
不过要提一提的是,控件背后的代码将一些值存储在引用视图状态的属性中(不将其存储在视图状态中,页面在每次回发时都会停止),稍后将其写入标记中,因此启动聊天知道谁应该成为对话的一部分。
请帮忙。
这里有一些代码:
StandAlonePanel.aspx -> 包含带有刷新按钮的更新面板。ChatControl.ascx ->
public int userId{
get
{
if (ViewState["UserID"] == null)
ViewState["UserID"] = 0;
return Convert.ToInt32(ViewState["UserID"]);
}
set
{
ViewState["UserID"] = value;
}
}
//--- Same for userName
if (userId == 0 && CurrentUserSession.User != null)
{
this.userId = CurrentUserSession.User.Id;
this.userName = CurrentUserSession.User.Name;
}
在标记中
var userInfo = {
userId : "<%= userId %>",
userName : "<%= userName %>",
IsAnonymized: "<%= IsAnonymized %>",
enableLogging: "<%= enableLogging %>"
}
if (chat != null) {
chat.Disconnect();
}
chat = new Chat(userInfo);
chat.Connect();
//-- 脚本连接
var hubConn = $.hubConnection(url);
hubConn.logging = self.enableLogging
hubConn.qs = { 'u': userInfo.userId, 'tc': '0', 'oo': userInfo.showOnlineOnly, 'ach': self.IsAnonymized, 'lgch': self.enableLogging }; /* Initiating queryString */
hubConn.error(function (error) {
logMe(error);
});
var hubProxy = new ChatProxy(hubConn);
/* hook up callbacks to hubProxy */
self.Connect = function () {
if (self.longpolling == true) {
hubConn.start({ transport: 'longPolling' }).done(function (result) {
///--
}).fail(function (error) {
///--
alert("error" + error);
});
}
else {
hubConn.start().done(function (result) {
///--
}).fail(function (error) {
///--
alert("error" + error);
});
}
}