ImageURL не работает внутри панели обновления - PullRequest
0 голосов
/ 31 августа 2011

Я пишу программу проверки подлинности с помощью капчи в ASP.NET C #. Проблема, с которой я сталкиваюсь, заключается в том, что изображение обновляется при вводе неправильного значения во время обратной передачи; но то же изображение не обновляется во время частичной обратной передачи, когда я храню их в панели обновления.

источник 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();
        }
    }

Ответы [ 4 ]

1 голос
/ 31 августа 2011

Я предполагаю, что ваша страница ~ / 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 голосов
/ 31 августа 2011

Попробуйте установить режим обновления панели обновления на «Условно» и обновите панель обновления после привязки капчи.

UpdatePanel1.Update();

Надеюсь, это сработает.

0 голосов
/ 31 августа 2011

Есть ли причина не использовать recaptcha?Я гарантирую его лучшее решение и его бесплатно.http://www.google.com/recaptcha/whyrecaptcha

В приведенном выше коде в сеансе используются два разных значения - это намеренно или является источником вашей проблемы?

Captcha и CaptchaImageTest

0 голосов
/ 31 августа 2011

Я полностью согласен с комментарием выше от @Aren. Я работал с панелями обновлений в течение 4 лет и видел, как они иногда занимаются всякими утомительными вещами. Используйте Jquery ajax, который вы можете видеть прозрачно, что произошло, и IMO действительно быстрее.

Это звучит как проблема с кэшированием. Убедитесь, что конечное изображение имеет случайное значение URL. таким образом, он не будет использовать кэшированную версию изображения. Используйте firebug, чтобы увидеть запрос GET на панели Net и посмотреть, загружает ли он последнее изображение или нет.

Не уверен, что это значит в этой строке. Что будет установлено imageurl после выполнения.

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