Создание System.Web.UI.Page программно в IHTTPHandler - PullRequest
6 голосов
/ 25 января 2009

Я пытаюсь использовать функциональность ASP.NET (3.5) «Модуль маршрутизации» для создания пользовательских страниц на основе содержимого URL.

В различных статьях объясняется, как использовать маршрутизацию ASP.NET для перехода к существующим страницам на веб-сервере.

Я хотел бы создать страницу на лету, используя код.

Моя первая попытка выглядит так:

public class SimpleRouteHandler : IRouteHandler
{

    public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        string pageName = requestContext.RouteData.GetRequiredString("PageName");

        Page myPage = new Page();
        myPage.Response.Write("hello " + pageName);
        return myPage;
    }
}

Но это вызывает исключение HTTPException, говорящее «Ответ недоступен в этом контексте». в операторе Response.Write.

Как поступить?

ОБНОВЛЕНИЕ: В конце я остановился на подходе, основанном на IHttpModule, который оказался довольно простым.

Ответы [ 3 ]

8 голосов
/ 10 января 2010

Вы не можете написать в ответ от IRouteHandler - это слишком рано в течение жизненного цикла запроса. Вы должны писать только в ответ из IHttpHandler, то есть Page.

Как показано в других примерах, вам нужно получить экземпляр страницы откуда-то, где есть все необходимое содержимое.

Вот как вы можете загрузить существующую страницу:

Page p = (Page)BuildManager.CreateInstanceFromVirtualPath("~/MyPage.aspx");

Или вы можете создать его с нуля:

Page p = new Page();
p.Controls.Add(new LiteralControl(
    @"<html>
      <body>
          <div>
              This is HTML!
          </div>
      </body>
      </html>"));
1 голос
/ 10 января 2010

Поместите requestContext перед Response.Write, поэтому requestContext.Response.Write

1 голос
/ 25 января 2009

Вместо того, чтобы пытаться писать прямо в ответ, вы можете просто добавить элементы управления на страницу. Поскольку страница является новой и не имеет разметки, вам, возможно, придется добавить все элементы HTML, чтобы сделать ее допустимой для правильного отображения. Никогда не пробуя этого, я понятия не имею, сработает ли это.

 Page myPage = new Page();
 page.Controls.Add( new LiteralControl( "hello " + pageName ) );
 return myPage;

Мне не ясно, что в нем будут необходимые теги HTML, HEAD и BODY. Возможно, было бы лучше создать базовую страницу с разметкой скелета, к которой вы можете просто добавить свои элементы управления и использовать BuildManager, как в примере для создания экземпляра этой страницы, а затем добавить свои элементы управления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...