HttpModule - احصل على محتوى HTML أو عناصر التحكم لإجراء التعديلات

StackOverflow https://stackoverflow.com/questions/333287

  •  22-07-2019
  •  | 
  •  

سؤال

حاولت شيئًا مثل هذا:

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);    

عند تشغيل هذا ، أحصل على "لم يتم تعيين مرجع الكائن على مثيل كائن". للسطر الأخير ...

كيف يمكنني إدراج سطرين من النص (asp.net/html) في مواقع محددة في الملف الأصلي؟وكيف يمكنني معرفة امتداد الملف (أريد فقط تطبيق هذا على ملفات aspx...؟

هل كانت مفيدة؟

المحلول

ولست متأكدا، ولكن أنا لا أعتقد أنه يمكنك استخدام HttpModule لتغيير الصفحة لشجرة التحكم (يرجى تصحيح لي إذا كنت مخطئا). يمكنك تعديل ترميز HTML ومع ذلك، سيكون لديك لكتابة "تصفية استجابة" لهذا الغرض. للحصول على مثال، انظر http://aspnetresources.com/articles/HttpFilters.aspx أو جوجل عن "مرشح استجابة httpmodule".

نصائح أخرى

وأبسط منه مما كنت اعتقد:

    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...
        }
    }

إذا حدث العرض المسبق ليس كافيا ش يمكن إضافة كل ما حدث ش حاجة في PreRequestHandlerExecute EventHandler ...

ويبدو أن الحل HttpFilter تفعل خدعة هنا: س)

إذا كنت قد استخدمت MOSS / صافي الإصدار 2.x + I يمكن أن تستخدم نسخة اساطير أو بإضافته علامات بلدي في صفحة رئيسية ...

وسوبر اقتراحات وبعد اختباري من الحل، سوف أقبل حل miies.myopenid.com كما يبدو أن حل قضية ثار الفعلية

كانت هناك بعض التغييرات في كيفية كتابة HttpModules في IIS7 مقارنة بـ IIS6 أو 5، لذلك قد يكون اقتراحي غير صالح إذا كنت تستخدم IIS7.

إذا كنت تستخدم الخاصية الثابتة الحالية لـ HttpContext، فيمكنك الحصول على مرجع للسياق الحالي.تحتوي فئة HttpContext على خصائص لكل من الطلب (نوع HttpRequest) والاستجابة (HttpResponse)، واعتمادًا على مكان الحدث الذي تتعامل معه (ربما يكون Application.EndRequest؟) يمكنك تنفيذ إجراءات مختلفة على هذه الكائنات.

إذا كنت تريد تغيير محتوى الصفحة التي يتم تسليمها، فمن المحتمل أن ترغب في القيام بذلك في وقت متأخر قدر الإمكان، لذا فإن الاستجابة لحدث EndRequest ربما يكون أفضل مكان للقيام بذلك.

يمكن التحقق من نوع الملف المطلوب عن طريق التحقق من خاصية Request.Url، ربما مع فئة System.IO.Path.جرب شيئًا مثل هذا:

string requestPath = HttpContext.Current.Request.Url.AbsolutePath;
string extension = System.IO.Path.GetExtension(requestPath);
bool isAspx = extension.Equals(".aspx");

تعديل المحتوى أصعب.قد تتمكن من القيام بذلك في أحد أحداث كائن السياق، لكنني لست متأكدًا.

قد يكون أحد الأساليب الممكنة هو كتابة فئة مشتقة من الصفحة المخصصة الخاصة بك والتي من شأنها التحقق من وجود قيمة في مجموعة context.Items.إذا تم العثور على هذه القيمة، فيمكنك إضافة تسمية إلى كائن PlaceHolder وتعيين نص التسمية على ما تريد.

شيء من هذا القبيل يجب أن تعمل:

أضف التعليمة البرمجية التالية إلى فئة مشتقة من 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";
  }

}

ثم تقوم بإضافة الفئة التالية إلى مجلد 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);

  }

}

ثم تقوم بتعديل صفحاتك مثل هذا:

public partial class _Default : CustomPage

لاحظ أنه تم تغيير الوراثة من System.Web.UI.Page إلى CustomPage.

وأخيرًا، يمكنك إضافة كائنات PlaceHolder إلى ملفات aspx الخاصة بك أينما تريد محتوى مخصصًا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top