2009-04-14 15 views
8

को नियंत्रित करने के लिए स्क्रॉल करें मुझे एक पृष्ठ में विशेष रूप से बड़ा रूप मिला है। जब फॉर्म मान्य होता है और कोई फ़ील्ड अमान्य है, तो मैं उस नियंत्रण में विंडो को स्क्रॉल करना चाहता हूं। नियंत्रण के फोकस() को कॉल करना ऐसा प्रतीत नहीं होता है। मुझे खिड़की को नियंत्रण में स्क्रॉल करने के लिए एक जावास्क्रिप्ट वर्कअराउंड मिला है, लेकिन क्या एएसपी.नेट में कुछ भी बनाया गया है?एएसपी.नेट:

उत्तर

2

MaintainScrollPositionOnPostback जोड़ा जा रहा है सबसे करीब है कि ASP.NET में बनाया गया है है, लेकिन निश्चित रूप से अमान्य क्षेत्र (रों) के लिए कूद नहीं होंगे।

<%@ Page MaintainScrollPositionOnPostback="true" %> 
+1

वह वर्णन नहीं कर रहा है - वह चाहता है कि वह पृष्ठ उस फॉर्म के भाग पर कूद जाए जो वैधता में विफल रहा, जरूरी नहीं कि उपयोगकर्ता पिछली बार स्थिति में था। –

+1

यह सवाल का जवाब नहीं देता है, लेकिन उसने * मेरी * समस्या हल की है। धन्यवाद! –

1

क्या आप वाकई Focus() तुम क्या वर्णन कर रहे हैं काम नहीं चलेगा हैं? हुड के तहत, यह अनिवार्य रूप से "जावास्क्रिप्ट वर्कअराउंड" कर रहा है - यह पृष्ठ पर कुछ जेएस लिखता है जो मिलान आईडी के साथ नियंत्रण पर फोकस() कहते हैं:

जो भी नियंत्रण फोकस() पृष्ठ समाप्त होने से पहले आखिरी बार बुलाया गया था प्रसंस्करण पेज को यह लिखते हैं:

<script type="text/javascript"> 
//<![CDATA[ 
WebForm_AutoFocus('txtFocus2');//]]> 
</script> 
0

मैं बुनियादी HTML fragments का उपयोग कर कुछ इसी तरह हासिल कर लिया है। तुम सिर्फ एक ज्ञात ID वाला तत्व छोड़:

<span id="CONTROL-ID"></span> 

और फिर या तो स्क्रिप्ट के माध्यम से, सर्वर साइड पर पर यूआरएल बदलने के लिए:

window.location += "#CONTROL-ID"; 

पहला मामला पृष्ठ पुनः लोड नहीं होगा, यह सिर्फ नियंत्रण के लिए नीचे स्क्रॉल होगा।

5

इसलिए मुझे विश्वास है कि समस्या यह है क्योंकि मैं WebControls के बजाय HtmlGenericControls पर ध्यान केंद्रित करने का प्रयास कर रहा था।

मैं बस के आधार पर एक समाधान कर समाप्त हो गया:

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(@" 

     <script type='text/javascript'> 

      $(document).ready(function() {{ 
       var element = document.getElementById('{0}'); 
       element.scrollIntoView(); 
       element.focus(); 
      }}); 

     </script> 

    ", control.ClientID)); 
} 

उपयोग:

if (!this.PropertyForm.Validate()) 
{ 
    this.PropertyForm.ErrorMessage.ScrollTo(); 
    failed = true; 
} 

(यह Page.RegisterClientScriptBlock प्रकट होता है() Page.ClientScript.RegisterClientScriptBlock के लिए हटा दिया गया है हालांकि())।

5

क्या आप अपने पृष्ठ पर एक सत्यापन सारांश का उपयोग कर रहे हैं?

यदि ऐसा है, तो एएसपी.नेट renders some javascript to automatically scroll to the top of the page जो अंतिम अमान्य नियंत्रण पर ध्यान केंद्रित करने के लिए क्लाइंट साइड सत्यापन के स्वचालित व्यवहार को ओवरराइड कर सकता है।

इसके अलावा, क्या आपने क्लाइंट साइड सत्यापन बंद कर दिया है?

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; 
} 

काम करने के लिए इस व्यवहार के लिए, आप आदर्श सुनिश्चित करना है कि आवश्यकता होगी आपके सभी वैधकर्ता टी सेट हैं o क्लाइंट-साइड - सर्वर साइड वैलिडेटर को स्पष्ट रूप से एक पोस्टबैक की आवश्यकता होगी, और इससे चीजों को प्रभावित हो सकता है (यानी। फोकस/स्थिति खोएं) - और सेटिंग को बनाए रखने के लिए StrollPositionOnPostBack को सही करने के लिए संभवतः पृष्ठ को अमान्य फ़ॉर्म तत्व के बजाय सबमिट बटन पर पुनः लोड करने का कारण बन जाएगा।

सर्वर पक्ष का उपयोग करना। फ़ोकस विधि ASP.NET को "पृष्ठ लोड पर" कुछ जावास्क्रिप्ट प्रस्तुत करने का कारण बनती है (यानी पृष्ठ के निचले भाग के पास), लेकिन ऊपर दिए गए अन्य तंत्रों में से एक द्वारा इसे ओवरराइड किया जा सकता है ।

2

बहुत सरल उपाय निम्नलिखित जावास्क्रिप्ट SetFocusOnError सच

+0

http://weblogs.asp.net/dfindley/archive/2007/06/29/a-quick-fix-for-the-validator-setfocusonerror-bug.aspx – softwaredeveloper

0

को RequiredFieldValidator की संपत्ति (या जो भी सत्यापनकर्ता नियंत्रण प्रयोग कर रहे हैं) स्थापित करने के लिए पेस्ट है:

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; 
    } 

तब में ScrollToFirstError() फोन अपने ऑनक्लिंट सहेजने वाले बटन का क्लिक करें, सुनिश्चित करें कि बटन में CausesValidation = true भी है।

वहां आपके पास है।

6
Page.MaintainScrollPositionOnPostBack = False 
Page.SetFocus(txtManagerName) 
+0

और आप कहां लिखते हैं 'पृष्ठ। MaintainScrollPositionOnPostBack = झूठा? –