2011-08-31 51 views
0

我正在ASP.NET C#中編寫驗證碼身份驗證程序。我面臨的問題是在回發期間輸入錯誤的值時圖像被刷新;但是同樣的圖像在部分回發期間不會刷新,當我將它們保存在更新面板中時。ImageURL在更新面板中不起作用

ASPX源

<asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
      <ContentTemplate>    
      <asp:Image ID="ImageCaptcha" runat="server" ImageUrl="~/BringImg.aspx" /><br /> 
      <asp:TextBox ID="txtCaptcha" runat="server" ></asp:TextBox><br />       
      <asp:Button ID="btnSubmit" runat="server" Text="Submit Project" OnClick="btnSubmit_Click"/> 
      </ContentTemplate> 
</asp:UpdatePanel> 

代碼背後:

private System.Random rand = new System.Random(); 
protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!Page.IsPostBack) 
     { 
      this.Session["Captcha"] = GenerateRandomCode(); 
     } 
    } 
protected void btnSubmit_Click(object sender, EventArgs e) 
    { 
     string temp = this.Session["Captcha"].ToString(); 
     if (string.Compare(temp, this.txtCaptcha.Text.Trim()) == 0) 
     {    
      // success logic 
     } 
     else 
     {      
      this.lblResult.Text = "Validation Text was not correct."; 
      this.Session["Captcha"] = GenerateRandomCode(); 
      ImageCaptcha.ImageUrl = "~/BringImg.aspx"; 
      ImageCaptcha.DataBind(); 
     } 
    } 
+1

坦白說,如果你能避免它,我會建議對ASP.NET AJAX和使用*真正* AJAX來代替。 – Aren

+1

你正在發送任何no-cache頭文件嗎? Internet Explorer是否設置爲自動獲取新版本的頁面?如果是這樣,在工具選項「瀏覽歷史 - >設置」下設置爲「每次我訪問網頁」 –

+0

我建議你設置ajax nocache選項,它是這樣的:$ .ajaxSetup({cache:false} }); –

回答

1

我猜你的〜/ BringImg.aspx頁面的源設置它是圖像的內容類型,並根據該會話值生成驗證碼圖像。在部分回發期間,圖像可能不會更新,因爲瀏覽器沒有意識到圖像內容已更改。有幾種方法可以讓瀏覽器知道圖像已經改變,但最容易測試的方法之一是將無意義的查詢字符串(對於每個圖像不同)應用到驗證碼的ImageUrl。

protected void btnSubmit_Click(object sender, EventArgs e) 
{ 
    string temp = this.Session["Captcha"].ToString(); 
    if (string.Compare(temp, this.txtCaptcha.Text.Trim()) == 0) 
    {    
     // success logic 
    } 
    else 
    {      
     this.lblResult.Text = "Validation Text was not correct."; 
     this.Session["Captcha"] = GenerateRandomCode(); 
     ImageCaptcha.ImageUrl = string.Format("~/BringImg.aspx?refresh={0}", Guid.NewGuid()); 
     ImageCaptcha.DataBind(); //This isn't necessary 
    } 
} 
+0

非常感謝:) – Jayesh

0

我完全同意從@Aren以上commenty。我已經與更新面板工作了4年,並且看到它有時會做所有有趣的事情。使用jquery ajax,而你可以透明地看到最新發生的事情,IMO也更快。

這聽起來像是一個緩存問題。確保最終圖片對網址具有隨機值。這樣它就不會使用緩存版本的圖像。使用firebug在Net面板中查看GET請求並查看是否正在下載最新映像。

不知道這條線是什麼意思。執行後將設置爲imageurl。

ImageCaptcha.ImageUrl = "~/BringImg.aspx"; 
+0

我正在使用UpdatePanels一段時間,並覺得他們比他們的價值更麻煩。你必須做太多的工作才能找到你想要的東西。 –

+0

@Sonesh這可能是一個緩存問題,因爲驗證碼內容被更改(通過代碼檢查它),但圖像不會相應更改。即使我輸入正確的內容,如驗證碼中所示,它表示錯誤的值。如果我應用完整的回發,值會發生變化。如何檢索更新面板內的圖像? – Jayesh

0

嘗試設置更新面板更新模式到「有條件」 和結合驗證碼更新後更新面板。

UpdatePanel1.Update(); 

希望這可以工作。

+0

沒有工作.... – Jayesh

0

任何不使用recaptcha的理由? 我保證它有更好的解決方案和免費。 http://www.google.com/recaptcha/whyrecaptcha

您的代碼在上面會話使用兩個不同的值 - 這是有意的還是你的問題?:

驗證碼和CaptchaImageTest

+0

這是一個錯字。會話變量相同,即驗證碼 – Jayesh

+0

當用戶輸入錯誤的驗證碼值並獲得另一次機會時,我不希望頁面執行回發。我想只有在用戶輸入正確的captcha值後回發纔會發生。這可以通過recaptcha來實現嗎? – Jayesh

+0

你排除緩存問題嗎?使用小提琴手並檢查返回的數據。它包含新的圖片標籤嗎? –

相關問題