【问题标题】:Render ASP.NET controls in a desktop application?在桌面应用程序中呈现 ASP.NET 控件?
【发布时间】:2010-02-16 19:00:00
【问题描述】:

是否可以获取一个页面对象,或者只是一个 ASP.NET 控件,并以某种方式在桌面应用程序中呈现它?

例如,作为桌面应用程序的 Visual Studio 在设计图面上呈现 ASP.NET 控件。我想做类似的事情。

编辑: 我正在就如何为一个非常简单的数据输入应用程序制作一个非常简单的设计器进行头脑风暴。我将有一些自定义的 ASP.NET 数据输入控件,并且我希望外行用户能够尽可能接近地看到页面的外观。所以我希望应用程序中的面板显示渲染的控件集合,但面板不需要以任何方式交互。 IE。无需单击和拖动或调整控件大小等。将有标准的 windows 窗体控件,表单作者与之交互以定义页面的布局。

我将简单地保存他们添加的控件列表以及“设计者”(他们是非技术专家)提供的一些其他信息,然后我将使用这些信息来创建实际的 aspx 页面,或者通过手册或自动化流程,待定。

【问题讨论】:

  • Visual Studio 不会按照您尝试的方式呈现 ASP.Net 控件。 (它不会在控件中执行任何 C# 代码)
  • @Slaks Yeh,我知道控件可以提供“假”渲染只是为了设计支持,但我不需要控件像在网页上那样表现,我只需要它们看起来尽可能接近它们在页面上的显示方式。

标签: c# .net asp.net


【解决方案1】:

是的,有可能。

您需要为 ASP.Net 创建一个单独的 AppDomain,如 here 所述。

编辑:要渲染页面,请使用以下代码:

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 的类型的公共方法。

【讨论】:

  • 但这会创建一个普通的 EXE 主机,而不是 ASP 主机。有不同的 CLR 主机,它们的行为也不同。虽然 EXE 和 ASP 主机之间的差异没有 EXE 和 SQL 主机(这是 MS 提供的 3 个 CLR 主机)之间的差异那么大,但差异恰恰在于 ASP 细节,如 IIS 请求环境和 HTTP 请求。我从未尝试在 EXE 主机中托管 ASP.Net 组件,如果它有效,我会很高兴。
  • @Remus:我在我的应用程序的生产环境中这样做。它不是 CLR 主机;它只是 ASP.Net 创建的第二个 AppDomain。
  • 我该死的... "允许在 Internet 信息服务 (IIS) 应用程序之外托管 ASP.NET 页面。此类使主机能够创建用于处理 ASP.NET 请求的应用程序域。 " ...不知道这是可能的,但听起来它确实像宣传的那样工作。您如何向此应用程序域中托管的组件发出虚假“请求”,以及如何取回响应?
  • @aaronls:不;这与 IIS 无关。
【解决方案2】:

我无法在这里得到流行的答案。然而,这似乎有效:

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?

【讨论】:

  • 这里的窍门是你需要 HttpContext.Current 在调用 BuildManager 之前存在
【解决方案3】:

我认为这是不可能的,但你可以让 WebBroswer 控件在其中加载 asp.net 网页。

【讨论】:

    【解决方案4】:

    是的,应该可以。渲染它意味着获取控件的 html,我不确定您将如何在应用程序中使用该 HTML。

    【讨论】:

    • 这不能回答问题。
    【解决方案5】:

    本文“Using the ASP.Net Runtime for extending desktop applications with dynamic HTML Scripts”提供了一个示例,说明如何运行超出已接受答案中所示的嵌入式 ASP.net 运行时。

    【讨论】:

      猜你喜欢
      • 2011-10-25
      • 1970-01-01
      • 2019-03-20
      • 2021-03-15
      • 1970-01-01
      • 1970-01-01
      • 2021-11-15
      • 2012-01-10
      • 2010-11-17
      相关资源
      最近更新 更多