Tôi có một biểu mẫu đặc biệt lớn trong một trang. Khi biểu mẫu được xác thực và một trường không hợp lệ, tôi muốn cuộn cửa sổ đến điều khiển đó. Gọi Focus của điều khiển() dường như không làm điều này. Tôi đã tìm thấy một cách giải quyết JavaScript để di chuyển cửa sổ để kiểm soát, nhưng có bất cứ điều gì được xây dựng vào ASP.NET?ASP.NET: Cuộn để điều khiển
Trả lời
Bạn nên nhìn vào jQuery và ScrollTo Plugin
Thêm MaintainScrollPositionOnPostback là gần nhất mà ASP.NET đã được xây dựng trong, nhưng sẽ không nhất thiết phải nhảy vào lĩnh vực không hợp lệ (s).
<%@ Page MaintainScrollPositionOnPostback="true" %>
Bạn có chắc chắn Focus() sẽ không làm những gì bạn mô tả? Dưới mui xe, về cơ bản nó thực hiện giải pháp "JavaScript" - nó viết một số JS tới trang gọi trọng tâm() trên điều khiển với ID phù hợp:
Điều khiển nào có tiêu điểm() được gọi trước khi trang kết thúc xử lý ghi điều này vào trang:
<script type="text/javascript">
//<![CDATA[
WebForm_AutoFocus('txtFocus2');//]]>
</script>
Tôi đã đạt được điều gì đó tương tự bằng cách sử dụng cơ bản HTML fragments. Bạn chỉ cần để lại một phần tử với một ID được biết:
<span id="CONTROL-ID"></span>
Và sau đó, hoặc thông qua kịch bản, vào ở phía máy chủ thay đổi url:
window.location += "#CONTROL-ID";
Trong trường hợp đầu tiên trang sẽ không tải lại, nó sẽ chỉ cuộn xuống phần điều khiển.
Vì vậy, tôi tin rằng vấn đề là vì tôi đã cố gắng tập trung vào HtmlGenericControls thay vì WebControls.
Tôi vừa kết thúc lên làm một workaround dựa tắt của:
http://ryanfarley.com/blog/archive/2004/12/21/1325.aspx http://www.codeproject.com/KB/aspnet/ViewControl.aspx
... vì lợi ích của thời gian.
public static void ScrollTo(this HtmlGenericControl control)
{
control.Page.RegisterClientScriptBlock("ScrollTo", string.Format(@"
<script type='text/javascript'>
$(document).ready(function() {{
var element = document.getElementById('{0}');
element.scrollIntoView();
element.focus();
}});
</script>
", control.ClientID));
}
Cách sử dụng:
if (!this.PropertyForm.Validate())
{
this.PropertyForm.ErrorMessage.ScrollTo();
failed = true;
}
(Mặc dù nó xuất hiện Page.RegisterClientScriptBlock() không được dùng cho Page.ClientScript.RegisterClientScriptBlock()).
Bạn đang sử dụng Tóm tắt xác thực trên trang của mình phải không?
Nếu vậy, ASP.NET renders some javascript to automatically scroll to the top of the page cũng có thể ghi đè hành vi tự động của xác thực phía máy khách để tập trung điều khiển không hợp lệ cuối cùng.
Ngoài ra, bạn đã tắt xác thực bên phía khách hàng chưa?
Nếu bạn có một cái nhìn tại javascript tạo ra bởi các xác nhận phía khách hàng mà bạn sẽ thấy phương pháp như thế này:
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);
}
Lưu ý các cuộc gọi đến ValidatorSetFocus, mà là một phương pháp khá dài mà cố gắng để thiết lập focus để kiểm soát trong câu hỏi, hoặc nếu bạn có nhiều sai sót, để kiểm soát cuối cùng đã được xác nhận, sử dụng (cuối cùng) dòng sau:
if (typeof(ctrl.focus) != "undefined" && ctrl.focus != null) {
ctrl.focus();
Page_InvalidControlToBeFocused = ctrl;
}
để có được hành vi này để làm việc, bạn sẽ lý tưởng cần phải đảm bảo rằng tất cả các trình xác thực của bạn được đặt t o là phía máy khách - trình xác thực bên máy chủ rõ ràng sẽ yêu cầu đăng lại và điều đó có thể ảnh hưởng đến mọi thứ (tức là mất tập trung/vị trí) - và thiết lập MaintainScrollPositionOnPostBack true có lẽ sẽ gây ra trang để tải lại vào nút gửi, chứ không phải là yếu tố hình thức không hợp lệ.
Sử dụng phía máy chủ.Focus method sẽ khiến ASP.NET hiển thị một số javascript "trên trang tải" (tức là gần cuối trang) nhưng điều này có thể bị tràn ngập bởi một trong các cơ chế khác được nêu trên .
giải pháp Rất đơn giản là để thiết lập thuộc tính SetFocusOnError của RequiredFieldValidator (hoặc bất cứ sự kiểm soát validator bạn đang sử dụng) là true
http://weblogs.asp.net/dfindley/archive/2007/06/29/a-quick-fix-for-the-validator-setfocusonerror-bug.aspx – softwaredeveloper
Dán javascript sau:
function ScrollToFirstError() {
Page_ClientValidate();
if (Page_IsValid == false) {
var topMostValidator;
var lastOffsetTop;
for (var i = 0; i < Page_Validators.length; i++) {
var vld = Page_Validators[i];
if (vld.isvalid == false) {
if (PageOffset(vld) < lastOffsetTop || lastOffsetTop == undefined) {
topMostValidator = vld;
lastOffsetTop = vld.offsetTop;
}
}
}
topMostValidator.scrollIntoView();
}
return Page_IsValid;
}
function PageOffset(theElement) {
var selectedPosY = 0;
while (theElement != null) {
selectedPosY += theElement.offsetTop;
theElement = theElement.offsetParent;
}
return selectedPosY;
}
Sau đó gọi ScrollToFirstError() trong bạn OnClientClick của nút đó là tiết kiệm, đảm bảo các nút có CausesValidation = true là tốt.
Ở đó bạn có nó.
Page.MaintainScrollPositionOnPostBack = False
Page.SetFocus(txtManagerName)
Và chính xác nơi nào bạn viết 'Page.MaintainScrollPositionOnPostBack = Sai'? –
- 1. Cuộn bảng điều khiển trung tâm trong điều khiển C#
- 2. Bảng điều khiển bọc WPF và cuộn
- 3. Thay đổi điều khiển truy cập của điều khiển ASP.NET
- 4. Điều khiển phân trang ASP.NET
- 5. lỗi asp.net tạo điều khiển
- 6. ASP.NET MVC - Qua JSON DateTime để điều khiển không ánh xạ tới tham số điều khiển
- 7. Mocking Asp.net-mvc Điều khiển ngữ cảnh
- 8. Ẩn thanh cuộn trong điều khiển webBộ điều khiển trình duyệt
- 9. Điều khiển biểu đồ cho ASP.NET
- 10. Vòng đời điều khiển ASP.NET MVC
- 11. đổi tên bộ điều khiển asp.net mvc
- 12. Xóa điều khiển asp.net khỏi mã sau
- 13. vẽ một nút trong bảng điều khiển winform trong khi bảng điều khiển được cuộn
- 14. ASP.NET: thêm điều khiển phía máy khách
- 15. Mảng tên miền điều khiển ASP.Net MVC
- 16. Điều khiển lịch biểu cho ASP.Net MVC
- 17. ASP.NET MVC: Cấu trúc bộ điều khiển
- 18. Điều khiển Telerik trong ASP.NET MVC
- 19. Gắn bảng điều khiển để chạy ứng dụng ASP.NET
- 20. Bật cuộn trên bảng điều khiển Microsoft cho Windows Forms
- 21. Ẩn thanh cuộn dọc trong điều khiển ListBox
- 22. Windows Phone 7 - điều khiển danh sách cuộn nhanh?
- 23. Phần tử bảng điều khiển động thêm và thanh cuộn
- 24. Tắt thanh cuộn ngang trong bảng điều khiển EXTJS
- 25. Bảng cuộn bảng điều khiển bố cục Bảng
- 26. Bảng điều khiển cuộn Google Maps giống như trong WPF
- 27. Làm mới trang asp.net từ điều khiển trong điều khiển khác
- 28. Làm thế nào để sao chép/sao chép một điều khiển (với điều khiển con) bằng cách sử dụng asp.net?
- 29. Điều khiển tùy chỉnh với ASP.NET MVC Razor
- 30. Truy cập tài nguyên toàn cầu trong điều khiển asp.net
Đó không phải là những gì anh ấy mô tả - anh ấy muốn trang chuyển đến một phần của biểu mẫu không xác thực được, không nhất thiết là vị trí người dùng ở lần cuối. –
Nó không trả lời câu hỏi, nhưng ông đã giải quyết * * vấn đề của tôi. Cảm ơn! –