我在页面中有一个特别大的表单.验证表单并且字段无效时,我想将窗口滚动到该控件.调用控件的Focus()似乎不会这样做.我找到了一个JavaScript解决方法来将窗口滚动到控件,但是ASP.NET内置了什么?
Page.MaintainScrollPositionOnPostBack = False Page.SetFocus(txtManagerName)
所以我认为问题是因为我试图专注于HtmlGenericControls而不是WebControls.
我刚刚结束了以下的解决方法:
http://ryanfarley.com/blog/archive/2004/12/21/1325.aspx http://www.codeproject.com/KB/aspnet/ViewControl.aspx
......为了时间的利益.
public static void ScrollTo(this HtmlGenericControl control) { control.Page.RegisterClientScriptBlock("ScrollTo", string.Format(@" ", control.ClientID)); }
用法:
if (!this.PropertyForm.Validate()) { this.PropertyForm.ErrorMessage.ScrollTo(); failed = true; }
(虽然看起来Page.RegisterClientScriptBlock()已弃用于Page.ClientScript.RegisterClientScriptBlock()).
您是否在页面上使用验证摘要?
如果是这样,ASP.NET 会渲染一些javascript以自动滚动到页面顶部,这可能会覆盖客户端验证的自动行为以聚焦最后一个无效控件.
此外,您是否关闭了客户端验证?
如果你看一下客户端验证生成的javascript,你应该看到这样的方法:
function ValidatorValidate(val, validationGroup, event) { val.isvalid = true; if ((typeof(val.enabled) == "undefined" || val.enabled != false) && IsValidationGroupMatch(val, validationGroup)) { if (typeof(val.evaluationfunction) == "function") { val.isvalid = val.evaluationfunction(val); if (!val.isvalid && Page_InvalidControlToBeFocused == null && typeof(val.focusOnError) == "string" && val.focusOnError == "t") { ValidatorSetFocus(val, event); } } } ValidatorUpdateDisplay(val); }
请注意对ValidatorSetFocus的调用,这是一个相当长的方法,尝试将焦点设置为有问题的控件,或者如果您有多个错误,则使用(最终)以下行来确认最后一个已验证的控件:
if (typeof(ctrl.focus) != "undefined" && ctrl.focus != null) { ctrl.focus(); Page_InvalidControlToBeFocused = ctrl; }
要使这种行为起作用,理想情况下需要确保所有验证器都设置为客户端 - 服务器端验证器显然需要回发,这可能会影响事物(即失去焦点/位置) - 并设置MaintainScrollPositionOnPostBack为true可能会导致页面重新加载到提交按钮,而不是无效的表单元素.
使用服务器端.Focus方法将导致ASP.NET在页面底部(即页面底部附近)呈现一些javascript,但这可能被上面讨论的其他机制之一覆盖.