c# - HttpModule: obtenga contenido HTML o controles para modificaciones
.net-1.1 (4)
No estoy seguro, pero no creo que puedas usar un HttpModule para alterar el árbol de control de la página (corrígeme si me equivoco). PUEDE modificar el marcado HTML sin embargo, tendrá que escribir un "filtro de respuesta" para esto. Para un ejemplo, vea http://aspnetresources.com/articles/HttpFilters.aspx , o google para "httpmodule response filter".
Trató algo como esto:
HttpApplication app = s as HttpApplication; //s is sender of the OnBeginRequest event
System.Web.UI.Page p = (System.Web.UI.Page)app.Context.Handler;
System.Web.UI.WebControls.Label lbl = new System.Web.UI.WebControls.Label();
lbl.Text = "TEST TEST TEST";
p.Controls.Add(lbl);
cuando ejecuto esto obtengo "Referencia de objeto no establecida en una instancia de un objeto". para la última línea ...
¿Cómo puedo insertar dos líneas de texto (asp.net/html) en ubicaciones específicas en el archivo original? ¿Y cómo averiguo la extensión del archivo (solo quiero aplicar esto en archivos aspx ...?
Se han producido algunos cambios en la forma de escribir HttpModules en IIS7 en comparación con IIS6 o 5, por lo que es posible que mi sugerencia no sea válida si está utilizando IIS7.
Si usa la propiedad estática actual de HttpContext, puede obtener una referencia al contexto actual. La clase HttpContext tiene propiedades tanto para la Solicitud (tipo HttpRequest) como para la Respuesta (HttpResponse) y dependiendo de dónde se maneje el evento (¿Application.EndRequest quizás?) Puede realizar varias acciones en estos objetos.
Si desea cambiar el contenido de la página entregada, probablemente desee hacerlo lo más tarde posible, por lo que responder al evento EndRequest es probablemente el mejor lugar para hacerlo.
Verificar qué tipo de archivo se solicitó se puede hacer marcando la propiedad Request.Url, tal vez junto con la clase System.IO.Path. Pruebe algo como esto:
string requestPath = HttpContext.Current.Request.Url.AbsolutePath;
string extension = System.IO.Path.GetExtension(requestPath);
bool isAspx = extension.Equals(".aspx");
Modificar el contenido es más difícil. Es posible que pueda hacerlo en uno de los eventos del objeto Contexto, pero no estoy seguro.
Un enfoque posible podría ser escribir su propia clase derivada de la página cusom que verificaría un valor en la colección Context.Items. Si se encuentra este valor, puede agregar una etiqueta a un objeto PlaceHolder y establecer el texto de la etiqueta a su gusto.
Algo como esto debería funcionar:
Agregue el siguiente código a una clase derivada de HttpModule:
public void Init(HttpApplication context)
{
context.BeginRequest += new EventHandler(BeginRequest);
}
void BeginRequest(object sender, EventArgs e)
{
HttpContext context = HttpContext.Current;
HttpRequest request = context.Request;
string requestPath = HttpContext.Current.Request.Url.AbsolutePath;
string extension = System.IO.Path.GetExtension(requestPath);
bool isAspx = extension.Equals(".aspx");
if (isAspx)
{
// Add whatever you need of custom logic for adding the content here
context.Items["custom"] = "anything here";
}
}
Luego agrega la siguiente clase a la carpeta App_Code:
public class CustomPage : System.Web.UI.Page
{
public CustomPage()
{ }
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
if (Context.Items["custom"] == null)
{
return;
}
PlaceHolder placeHolder = this.FindControl("pp") as PlaceHolder;
if (placeHolder == null)
{
return;
}
Label addedContent = new Label();
addedContent.Text = Context.Items["custom"].ToString();
placeHolder .Controls.Add(addedContent);
}
}
Entonces usted modifica sus páginas de esta manera:
public partial class _Default : CustomPage
Tenga en cuenta que la herencia se cambia de System.Web.UI.Page a CustomPage.
Y finalmente agregas objetos PlaceHolder a tus archivos aspx donde desees contenido personalizado.
Parece que la solución HttpFilter está haciendo el truco aquí: o)
Si hubiera usado MOSS / .net 2.x + podría haber usado la versión de Runas o simplemente haber agregado mis etiquetas en una página maestra ...
Súper sugerencias y después de mi prueba de la solución, aceptaré la solución de miies.myopenid.com, ya que parece resolver el problema real
Es más simple de lo que piensas:
public void Init(HttpApplication app)
{
app.PreRequestHandlerExecute += OnPreRequestHandlerExecute;
}
private void OnPreRequestHandlerExecute(object sender, EventArgs args)
{
HttpApplication app = sender as HttpApplication;
if (app != null)
{
Page page = app.Context.Handler as Page;
if (page != null)
{
page.PreRender += OnPreRender;
}
}
}
private void OnPreRender(object sender, EventArgs args)
{
Page page = sender as Page;
if (page != null)
{
page.Controls.Clear(); // Or do whatever u want with ur page...
}
}
Si el evento PreRender no es suficiente, puede agregar el evento que necesite en PreRequestHandlerExecute EventHandler ...