문제

다음과 같이 시도했습니다.

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

이것을 실행할 때 "객체 참조가 객체 인스턴스로 설정되지 않음"을 얻습니다. 마지막 줄은 ...

원본 파일의 특정 loaction에 두 줄의 텍스트 (asp.net/html)를 삽입하려면 어떻게해야합니까? 그리고 파일의 확장을 어떻게 파악합니까 (ASPX 파일에서만 적용하고 싶습니다 ...?

도움이 되었습니까?

해결책

확실하지 않지만 HTTPModule을 사용하여 페이지의 제어 트리를 변경할 수 있다고 생각하지 않습니다 (내가 틀렸을 때 저를 수정하십시오). 그러나 HTML 마크 업을 수정할 수 있지만이를 위해 "응답 필터"를 작성해야합니다. 예를 들어, 참조하십시오 http://aspnetresources.com/articles/httpfilters.aspx, "HTTPModule 응답 필터"의 Google.

다른 팁

당신이 생각하는 것보다 단순합니다.

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

Prerender 이벤트가 충분하지 않은 경우 u prerequesthandlerexecute 이벤트 핸들러에서 필요한 이벤트를 추가 할 수 있습니다 ...

HTTPFilter 솔루션이 여기서 트릭을 수행하는 것 같습니다 : o)

Moss/.NET 2.X+를 사용했다면 Runes 버전을 사용하거나 마스터 페이지에 태그를 추가했을 수 있습니다 ...

슈퍼 제안과 솔루션을 테스트 한 후에는 실제 문제를 해결하는 것처럼 보이는 miies.myopenid.com의 솔루션을 받아 들일 것입니다.

IIS6 또는 5와 비교하여 IIS7에서 HTTPModules를 작성하는 방법에는 약간의 변화가 있었으므로 IIS7을 사용하는 경우 제안이 유효하지 않을 수 있습니다.

HTTPContext의 현재 정적 속성을 사용하는 경우 현재 컨텍스트에 대한 참조를 얻을 수 있습니다. httpcontext 클래스에는 요청 (httprequest type)과 응답 (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 Collection에서 값을 확인하는 자신의 Cusom 페이지 파생 클래스를 작성하는 것입니다. 이 값이 발견되면 자리 표시 자 개체에 레이블을 추가하고 레이블의 텍스트를 원하는대로 설정할 수 있습니다.

이와 같은 것이 효과가 있어야합니다.

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로 변경됩니다.

마지막으로 사용자 정의 콘텐츠를 원하는 곳마다 ASPX 파일에 자리 표시 자 개체를 추가합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top