2009-03-05 28 views
7

एसिंक्रोनस पोस्टबैक के बाद पृष्ठ के शीर्ष पर स्क्रॉल स्थिति को रीसेट करने का सबसे अच्छा तरीका क्या है?Async पोस्टबैक के बाद स्क्रॉल स्थिति रीसेट करें - ASP.NET

एएसपी.NET ग्रिड व्यू कमांडफ़िल्ल्ड कॉलम से एसिंक्रोनस पोस्टबैक शुरू किया गया है और एएसपी.NET अद्यतन पैनल अद्यतन विधि को ग्रिड व्यू ऑनरो कॉमांड में कहा जाता है।

मेरा वर्तमान एप्लिकेशन एक एएसपी.नेट 3.5 वेबसाइट है।

संपादित करें: मैं हर किसी से उत्कृष्ट प्रतिक्रिया प्राप्त हुआ है, और मैं एक स्क्रिप्ट टैग में विधियां विधि का उपयोग कर समाप्त हो गया है, लेकिन मेरी अगली सवाल यह है:

मैं इसे कैसे केवल जब निष्पादित उपयोगकर्ता क्लिक करने के लिए कॉन्फ़िगर करूँ मेरे ग्रिड व्यू नियंत्रण में एएसपी.नेट कमांडफिल्ड? मेरे पास पृष्ठ पर अन्य बटन हैं जो एक असीमित पोस्टबैक करते हैं जिसे मैं पृष्ठ के शीर्ष पर स्क्रॉल नहीं करना चाहता हूं।

संपादित करें 1: मैंने एक समाधान विकसित किया है जहां मुझे PageRequestManager का उपयोग करने की आवश्यकता नहीं है। समाधान के लिए मेरा अनुवर्ती उत्तर देखें।

उत्तर

4

यहाँ निम्नलिखित समाधान के पीछे मैं इस source

ASP.NET वेबफ़ॉर्म

<script language="javascript" type="text/javascript"> 
    function SetScrollEvent() { 
     window.scrollTo(0,0); 
    } 
</script> 

<asp:GridView id="MyGridView" runat="server" OnRowDataBound="MyGridView_OnRowDataBound"> 
    <Columns> 
     <asp:CommandField ButtonType="Link" ShowEditButton="true" /> 
    </Columns> 
</asp:GridView> 

ASP.NET वेबफ़ॉर्म कोड के आधार पर विकसित की है लगता है बीमार पद

protected void MyGridView_OnRowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if(e.Row.RowType.Equals(DataControlRowType.DataRow)) 
    { 
     foreach (DataControlFieldCell cell in e.Row.Cells) 
     { 
      foreach(Control control in cell.Controls) 
      { 
       LinkButton lb = control as LinkButton; 

       if (lb != null && lb.CommandName == "Edit") 
        lb.Attributes.Add("onclick", "SetScrollEvent();"); 
      } 
     } 
    } 
} 
0

क्या आपने पृष्ठ संपत्ति रखरखाव स्क्रॉलपोजिशन सेट की है? सुनिश्चित नहीं है कि यदि आप Async पोस्टबैक करते हैं या नहीं तो यह अलग होगा।

संपादित करें: एक चीज जिसे आप कोशिश कर सकते हैं वह है अपने पृष्ठ के शीर्ष के पास किसी विशेष आइटम पर फ़ोकस सेट करना, जो मदद और गंदे काम के आसपास हो सकता है।

+0

मैं केवल एएसपी.NET ग्रिड व्यू के इस विशिष्ट कार्यक्रम के साथ पृष्ठ के शीर्ष पर वापस जाना चाहता हूं। मेरे पास उसी पृष्ठ पर अन्य बटनों का एक गुच्छा है जिसे मैं स्क्रॉल स्थिति को बनाए रखना चाहता हूं। –

15

आप ASP.NET AJAX में हुक करने की जरूरत के लिए UpdatePanels आप जा रहे हैं के रूप में उपयोग कर रहे हैं PageRequestManager

आप endRequest घटना हुक कि कर रहे हैं के लिए एक विधि जोड़ने की आवश्यकता होगी:

एक एसिंक्रोनस पोस्टबैक समाप्त होने के बाद उठाया गया है और ब्राउज़र को नियंत्रण वापस कर दिया गया है।

<script type="text/javascript"> 
    Sys.WebForms.PageRequestManager.getInstance().add_endRequest(pageLoaded); 

    function pageLoaded(sender, args) { 
    window.scrollTo(0,0); 
    } 
</script> 

कौन सा ब्राउज़र पृष्ठ के शीर्ष एक बार एक अद्यतन अनुरोध पूर्ण हो गया पर स्क्रॉल करने के लिए बाध्य करेगा:

तो तुम जैसे कुछ होगा।

अन्य घटनाओं आप में हुक सकता है कर रहे हैं के बजाय निश्चित रूप से:

beginRequest // Raised before the request is sent 
initializeRequest // Raised as the request is initialised (good for cancelling) 
pageLoaded // Raised once the request has returned, and content is loaded 
pageLoading // Raised once the request has returned, and before content is loaded 

अतुल्यकालिक बाद पीठ की सुंदरता उस पृष्ठ आप MaintainScrollPosition सेट किए बिना स्क्रॉल ऊंचाई को बनाए रखेंगे, क्योंकि वहां कोई है "पूर्ण पृष्ठ रीलोड" हो रहा है, इस मामले में आप वास्तव में उस प्रभाव को करना चाहते हैं, इसलिए आपको इसे मैन्युअल रूप से बनाना होगा।अद्यतन सवाल

ठीक है पर प्रतिक्रिया के लिए

संपादित करें, ताकि आप कुछ इस तरह करने की आवश्यकता होगी यदि आप किसी विशेष बटन प्रेस पर स्थिति रीसेट करने की आवश्यकता: hooking द्वारा

प्रारंभ BeginRequest में बजाय/साथ ही:

Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(BeginRequestHandler); 

इसका कारण यह है में args मानदंड आप तक पहुँच प्राप्त:

012,
args.get_postBackElement().id 

जो तुम बटन है कि पूरे घटना शुरू कर दिया की आईडी बता देंगे - आप तो या तो मूल्य की जाँच कर सकते यहाँ, और पेज ले जाते हैं, या एक चर में संग्रहीत है, और अंत अनुरोध में यह क्वेरी - रेस स्थितियों, आदि से अवगत होना, जहां उपयोगकर्ता आपके मूल अपडेट को पूरा करने से पहले एक और बटन क्लिक करता है।

आप किसी भी भाग्य के साथ जा रहा मिलना चाहिए यही कारण है कि - वहाँ Working with PageRequestManager Events

2

पर इस के आसपास काफी कुछ उदाहरण आप asp.net AJAX का उपयोग कर रहे है? यदि ऐसा है तो क्लाइंट लाइब्रेरीज़ आंशिक/एसिंक पोस्टबैक वाली समस्याओं में से एक, प्रारंभिक/async पोस्टबैक के साथ दो बहुत उपयोगी घटनाएं हैं, यह है कि सामान्य पृष्ठ को कोई संकेत नहीं मिला है कि आप क्या कर रहे हैं। प्रारंभ और अनिश्चित घटनाएं आपको क्लाइंट पर स्क्रॉल स्थिति बनाए रखने की अनुमति देगी, आपके पास जेएस में एक var हो सकता है जो प्रारंभिक पर स्क्रॉल स्थिति पर सेट हो, फिर अंतिम अनुरोध पर आप जो भी तत्व स्क्रॉल कर सकते हैं उसे रीसेट कर सकते हैं .. मुझे यकीन है कि यह पहले देखा गया है लेकिन एक लिंक नहीं मिल सकता है। अगर मैं एक उदाहरण

0

मैं एक छिपी हुई इनपुट का उपयोग करता हूं जिसे HScrollTop कहा जाता है जिसे मैंने एएसपीनेट फॉर्म को वापस पोस्ट करने से पहले सेट किया था। फिर, जब पृष्ठ लोड होता है, तो यह छुपा इनपुट के मान के अनुसार scrollTop सेट करता है।

इस कोड को एक नए पेज पर आज़माएं।

<div style="height:500px"></div> 

<form id="Form1" runat=server onsubmit="javascript:saveScrollTop();"> 
    <input type=submit value="Submit" runat=server> 
    <input type="hidden" id="hScrollTop" runat=server> 
</form> 

<div style="height:1000px"></div> 

<script language="javascript"> 
    function saveScrollTop() { 
     document.getElementById("<%= hScrollTop.ClientID %>").value = document.body.scrollTop; 
     return true; 
    } 

    window.onload = function() { 
     document.body.scrollTop = document.getElementById("<%= hScrollTop.ClientID %>").value; 
    } 

</script> 
2

इस ट्यूटोरियल से लिया:

http://aspnet.4guysfromrolla.com/articles/111407-1.aspx

हम सेट MaintainScrollPositionOnPostback = सच

तो अगर हम स्क्रॉल स्थिति विधि कॉल रीसेट करने की आवश्यकता:

Private Sub ResetScrollPosition() 
If Not ClientScript.IsClientScriptBlockRegistered(Me.GetType(), "CreateResetScrollPosition") Then 
    'Create the ResetScrollPosition() function 
    ClientScript.RegisterClientScriptBlock(Me.GetType(), "CreateResetScrollPosition", _ 
        "function ResetScrollPosition() {" & vbCrLf & _ 
        " var scrollX = document.getElementById('__SCROLLPOSITIONX');" & vbCrLf & _ 
        " var scrollY = document.getElementById('__SCROLLPOSITIONY');" & vbCrLf & _ 
        " if (scrollX && scrollY) {" & vbCrLf & _ 
        " scrollX.value = 0;" & vbCrLf & _ 
        " scrollY.value = 0;" & vbCrLf & _ 
        " }" & vbCrLf & _ 
        "}", True) 

    'Add the call to the ResetScrollPosition() function 
    ClientScript.RegisterStartupScript(Me.GetType(), "CallResetScrollPosition", "ResetScrollPosition();", True) 
End If 
End Sub 
11

यहाँ स्क्रॉल बार स्थिति को शीर्ष पर रीसेट करने का एकदम सही समाधान है AJAX

क्लाइंट साइड कोड

function ResetScrollPosition() 
{ 
    setTimeout("window.scrollTo(0,0)", 0); 
} 

सर्वर साइड कोड

ScriptManager.RegisterStartupScript(Page, this.GetType(), "ScrollPage", "ResetScrollPosition();", true); 

केवल, window.scrollTo (0,0) काम नहीं करेगा। इस मामले में अजाक्स को प्राथमिकता दी जाएगी, इसलिए आपको इसके साथ सेटटाइमआउट फ़ंक्शन का उपयोग करना होगा।

+0

हाँ, लेकिन क्या होगा यदि आप केवल कुछ घटनाओं पर ऐसा करना चाहते हैं, और केवल कुछ समय पर जब बटन क्लिक किया जाता है? –

0
Page.RegisterStartupScript("MyScript", "<script language=javascript>setTimeout('window.scrollTo(0,0)', 0);</script>"); 

समारोह है कि आप पृष्ठ के शीर्ष पर जाने के लिए बताना चाहता हूँ के लिए ऊपर रखो। जैसे कि पृष्ठ वैध नहीं है, वहां वह है और यह पृष्ठ के शीर्ष पर आपको शूट करने के लिए अस्थायी जावास्क्रिप्ट जोड़ देगा।

संबंधित मुद्दे