在后背上保持专注显然是一项艰巨的任务。搜索谷歌,你会发现很多人都渴望同样的东西,但都以不同的方式联系起来,而且大多是习惯性的。我想避免自定义实现,特别是如果.NET 支持它的方式。只有经过一些非常深入的搜索,我才遇到 PostBackOptions.TrackFocus,在另一个堆栈溢出帖子中悄悄提到。根据 MSDN:
获取或设置一个值,该值指示回发事件是否应将页面返回到当前滚动位置并将焦点返回到当前控件。"
废话,.NET 4 支持吗?惊人的。但是我们有大量的自定义控件,.NET 怎么知道如何将焦点设置在控件上?我不知道。查看 System.Web.UI.Control 的 MSDN 文档,有一个有趣的方法:
public virtual void Focus()
“使用 Focus 方法将网页的初始焦点设置为控件。该页面将在浏览器中打开并选择控件。”
好吧,显然可以覆盖。但是这样做的推荐方法是什么?它返回无效。没有例子。找不到任何人在其实现中覆盖此方法的示例。然而,在覆盖它并且除了抛出异常之外什么都不做之后,很明显这不是 ASP.NET 将焦点放在回发之前具有焦点的控件上的方式:它永远不会被调用。
在使用 Firebug 进行大量调试后,我发现启用 PostBackOptions.TrackFocus 有效!有时。很明显,控件的焦点只有在控件调用 __doPostBack JavaScript 方法时才会保持。启动 PostBack 的其他控件(当在控件内按 enter 时)调用 WebForm_OnSubmit(),它不会更新 ASP 隐藏字段 __LASTFOCUS。__doPostBack 在设置隐藏字段后调用 WebForm_OnSubmit()。
这是我目前陷入困境的地方。无论如何,我似乎都需要调用 __doPostBack。关于使用 TrackFocus 的文档非常非常少。那么有人有任何提示吗?