Использование ASP.NET AJAX UpdatePanel с обработчиками
-
11-09-2019 - |
Вопрос
Я использую UpdatePanel для некоторых элементов управления, специально для капч, поэтому, когда AsyncPostBack выполняется с помощью кнопки «btnQuery», как я могу сказать .ashx (обработчику для капчи) обновить его самостоятельно?
Я использую сеанс для проверки изображения в капче на число на входе под изображением.
это обработчик:
<%@ WebHandler Language="C#" Class="captcha" %>
using System;
using System.Web;
using System.Web.SessionState;
using System.Drawing;
public class captcha : IHttpHandler, IRequiresSessionState
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "image/GIF";
Bitmap imagen_GIF = new System.Drawing.Bitmap(80, 30);
Graphics grafico = System.Drawing.Graphics.FromImage(imagen_GIF);
grafico.Clear(Color.Gainsboro);
Font tipo_fuente = new Font("Comic Sans", 12, FontStyle.Bold);
string randomNum = string.Empty;
Random autoRand = new Random();
for (int x = 0; x < 5; x++)
{
randomNum += System.Convert.ToInt32(autoRand.Next(0, 9)).ToString();
}
int i_letra = System.Convert.ToInt32(autoRand.Next(65, 90));
string letra = ((char)i_letra).ToString();
randomNum += letra;
context.Session["RandomNumero"] = randomNum;
grafico.DrawString(randomNum, tipo_fuente, Brushes.Black, 5, 5);
imagen_GIF.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Gif);
tipo_fuente.Dispose();
grafico.Dispose();
imagen_GIF.Dispose();
}
public bool IsReusable { get { return false; } }
}
хочу обновить картинку..не просто так делаю:
public void postbackear()
{
string script = string.Format("Sys.WebForms.PageRequestManager.getInstance()._doPostBack('{0}', '');",
btnConsulta.ID);
ScriptManager.RegisterStartupScript(this.Page, typeof(string), "Refresh", script, true);
}
Решение
Попробуйте варианты кэширования для обработчиков, например
context.Response.Cache.SetExpires(DateTime.Now);
context.Response.Cache.SetCacheability(HttpCacheability.Public);
context.Response.Cache.SetValidUntilExpires(false);
Если вышеизложенное не работает, единственная идея, которая у меня осталась, - это вызов обработчика с помощью queryString, чтобы источник изображения не был одинаковым каждый раз, когда вы вызываете
Image1.ImageUrl = "Handler.aspx?guid=" + Guid.NewGuid();
Другие советы
Находится ли изображение внутри UpdatePanel?Я бы поставил его туда, если это не так.Кроме того, каждый раз при обновлении панели убедитесь, что URL-адрес изображения уникален, чтобы клиенты (браузеры) или прокси-серверы не использовали кэшированное изображение.Guid, добавленный в качестве параметра строки запроса, должен помочь (например,YourImageHandler.ashx?xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx).
Ангел,
Изображение не запрашивается повторно с сервера, поэтому у обработчика нет возможности выполнить его.Чтобы это выполнить снова, вы должны заставить браузер снова получить изображение.
Тем не менее, если в вашей асинхронной обратной передаче ничего не обновляется, у браузера не будет причин снова получать его, независимо от настроек кеша и т. д.
Вы можете решить эту проблему с помощью сценария, но более простой способ — последовать совету Майры и добавить GUID к строке запроса изображения и измените этот GUID как часть вашей асинхронной обратной передачи.Это обновит URL-адрес изображения, необходимого на клиенте, и заставит его вернуться на сервер для получения нового изображения.
Если это не решит проблему, опубликуйте раздел вашего web.config, который сопоставляет запросы с обработчиком изображения, а также код, который вы используете для добавления изображения на страницу.