2010-02-16 6 views
4

Можно ли использовать объект страницы или, возможно, только один элемент управления ASP.NET, и каким-то образом отобразить его в настольном приложении?Render ASP.NET управляет в настольном приложении?

Например, Visual Studio, являясь настольным приложением, визуализирует элементы управления ASP.NET на поверхности дизайна. Я хочу сделать что-то подобное.

Редактировать: Я занимаюсь мозговым штурмом, как сделать очень простой конструктор для очень простого приложения ввода данных. У меня были бы некоторые пользовательские элементы управления вводом данных ASP.NET, и я хочу, чтобы пользователи-пользователи могли видеть, как может выглядеть страница как можно ближе. Поэтому я хочу, чтобы панель в приложении отображала визуализированную коллекцию элементов управления, но панель не должна быть интерактивной. То есть нет щелчка и перетаскивания или изменения размера элементов управления и т. д. Будут стандартные элементы формы окна, с которыми взаимодействует автор формы для определения макета страницы.

Я просто сохраню список элементов управления, которые они добавили, с другой информацией, которую предоставляет разработчик (которые являются нетехническими экспертами), и я буду использовать эту информацию, чтобы позже создать фактическую страницу aspx, либо через ручной или автоматизированный процесс, TBD.

+0

Visual Studio не отображает ASP.Net так, как вы пытаетесь. (Он не выполняет никаких C# -кодов в элементах управления) – SLaks

+0

@Slaks Yeh, я знаю, что элементы управления могут обеспечить «фальшивый» рендеринг только для поддержки дизайна, но мне не нужны элементы управления, которые будут вести себя так, как на веб-странице, Мне просто нужно, чтобы они выглядели как можно ближе к тому, как они появятся на странице. – AaronLS

ответ

7

Да, это возможно.

Вам необходимо создать отдельный AppDomain для ASP.Net, как описано here.

EDIT: Оказывать страницы, используйте следующий код:

string htmlSource; 
var page = (Page)BuildManager.CreateInstanceFromVirtualPath(virtualPath, typeof(Page)); 

page.ProcessRequest(new HttpContext(new SimpleWorkerRequest("", null, null))); 
using (var writer = new StringWriter(CultureInfo.InvariantCulture)) { 
    using (var htmlWriter = new HtmlTextWriter(writer)) 
     page.RenderControl(htmlWriter); 
    htmlSource = writer.ToString(); 
} 

Обратите внимание, что этот код должен работать в ASP.Net AppDomain.
Для этого вы можете ввести общедоступный метод типа, который вы указываете CreateApplicationHost.

+1

Но это создает обычный хост EXE, а не хост ASP. Существуют разные хосты CLR, и они ведут себя по-разному. Хотя разница между хостами EXE и ASP не такая большая, как между хостами EXE и SQL (это 3 хоста CLR, отправленные MS), различия в точности соответствуют специфике ASP, например, запросу IIS request и HTTP-запросу. Я никогда не пытался разместить ASP.Net componeent на хосте EXE, я был бы любезен, если он будет работать. –

+0

@Remus: Я делаю это в производстве в своем приложении. Это не CLR-хост; это просто второй AppDomain, созданный ASP.Net. – SLaks

+0

Я буду чертовски ... »Разрешает размещение страниц ASP.NET за пределами приложения IIS. Этот класс позволяет хосту создавать домены приложений для обработки запросов ASP.NET». ... Не знал, что это возможно, но звучит так, как будто оно работает как рекламируемое. Как вы делаете поддельный «запрос» к компоненту, размещенному в этом домене приложения, и как вы возвращаете ответ? –

1

Я не думаю, что это возможно, но вы можете контролировать элемент управления WebBroswer на веб-странице asp.net.

0

Да, это должно быть возможно. Чтобы отобразить это, чтобы получить html элемента управления, я не уверен, как вы собираетесь использовать этот HTML-код в своем приложении.

+0

Это не отвечает на вопрос. – SLaks

+0

Вы можете объяснить немного больше? – Shoban

3

Я не смог получить популярный ответ здесь для работы. Это, однако, кажется, работает:

public string AspxToString(string aspx) 
{ 
    StringBuilder sb = new StringBuilder(); 
    using (StringWriter sw = new StringWriter(sb)) 
    { 
     using (HtmlTextWriter tw = new HtmlTextWriter(sw)) 
     { 
      var workerRequest = new SimpleWorkerRequest(aspx, "", tw); 
      HttpContext.Current = new HttpContext(workerRequest); 

      object view = BuildManager.CreateInstanceFromVirtualPath(aspx, typeof(object)); 

      Page viewPage = view as Page; 
      if (viewPage == null) 
      { 
       UserControl viewUserControl = view as UserControl; 
       if (viewUserControl != null) 
       { 
        viewPage = new Page(); 
        viewPage.Controls.Add(viewUserControl); 
       } 
      } 

      if (viewPage != null) 
      { 
       HttpContext.Current.Server.Execute(viewPage, tw, true); 

       return sb.ToString(); 
      } 

      throw new InvalidOperationException(); 
     } 
    } 
} 

Если вы используете это с настольного приложения, вы будете нуждаться в AppDomain см Is there a way to process an MVC view (aspx file) from a non-web application?

+0

трюк здесь вам нужен HttpContext.Current, чтобы существовать до вызова BuildManager –

Смежные вопросы