2012-05-16 5 views
3

Мы хотим иметь возможность менять/заменять/переопределять ASPX-файлы изредка. Это сценарий.Подстановка ASPX-файла

У нас есть портал, написанный с ASP.NET, который уже содержит тысячи страниц - для просмотра данных, обновления записей, отчетов и т. Д. Некоторые клиенты «действительно важны», и поэтому нам нужно иметь возможность настраивать определенные страницы только для них, поэтому при входе в систему они видят страницу, настроенную для них.

Основные страницы - отличные - мы можем настроить верхний колонтитул, нижний колонтитул и т. Д., Но мы можем захотеть скрыть определенные области или полностью переместить их. Мы не можем делать это с помощью мастер-страниц.

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

Так что я хочу, чтобы иметь возможность писать код, чтобы идти «Эй, я зарегистрирован как специальный клиент, идите, узнайте, есть ли страница переопределения .aspx для той, в которой я включен. есть, используйте это. В противном случае используйте .aspx, который уже есть ».

Это означает, что у меня может быть каталог на моем сервере для каждого из моих «специальных клиентов» с нечетным .aspx-файлом, который переопределяет значение по умолчанию.

Как я могу это достичь?

Большое спасибо Ник

ответ

3

Чтобы сделать это, вам нужно зарегистрировать страницу завод, который обрабатывает .aspx файлы. Поэтому сначала создать новый класс, который расширяет PageHandlerFactory:

public class MyPageFactory : PageHandlerFactory 
{ 
    public override IHttpHandler GetHandler(
     HttpContext httpContext, string requestType, string url, 
     string pathTranslated) 
    { 
     // Here you can inspect `HttpContext` and perform whatever checks you 
     // need to determine whether or not to use your custom overridden page. 
     if (shouldOverride) 
     { 
      var newVirtualPath = "/Overrides/Foo/MyPage.aspx"; 
      string newFilePath = httpContext.Server.MapPath(newVirtualPath); 

      // Now create the page instance 
      IHttpHandler page = PageParser.GetCompiledPageInstance(newVirtualPath, newFilePath, httpContext); 
      return page; 
     } 
     else 
     { 
      // If we're not overriding, just return the default implementation 
      return base.GetHandler(httpContext, requestType, url, pathTranslated); 
     } 
    } 
} 

Не забудьте зарегистрировать его в web.config (IIS7):

<system.webServer> 
    <httpHandlers> 
     <add verb="*" path="*.aspx" type="MyPageFactory" /> 
    </httpHandlers> 
</system.webServer> 

< Или IIS7:

<system.web> 
    <httpHandlers> 
     <add verb="*" path="*.aspx" type="MyPageFactory" /> 
    </httpHandlers> 
</sysetm.web> 
+0

Блестящий - это сработало. Пришлось изменить первую регистрацию httphandler, чтобы удалить атрибут name и добавить пространство имен в атрибут type. Также опечатайте в «httpContext.Server.MapPath (virtualPath)»; - должен быть «httpContext.Server.MapPath (newVirtualPath)»; – nickthompson

+0

Рад, что это сработало. И спасибо за комментарии - исправил ответ. –

1

I предположим, что механизм идентификации типа клиента для отображения определенной информации находится в базе данных?

В любом случае, мне кажется, что вы говорите, это предоставление некоторых функций, подобных CMS, где вы можете специализировать контент по типу пользователя и т. Д. Вместо того, чтобы переопределять страницу и менять ее, что возможно, но может сделать его чрезмерно сложным, использовать XML или базу данных для хранения контента для определенных регионов страницы и вытаскивать их в тех регионах, когда пользователь обращается к странице.

Затем вы можете привязать регионы страницы к роли пользователя (если все в базе данных). Тогда вы можете даже разрешить определенную роль настраивать контент, если это необходимо.