是否可以获取页面对象,或者只是一个ASP.NET控件,并以某种方式在桌面应用程序中呈现它?
例如,作为桌面应用程序的Visual Studio在设计图层中呈现ASP.NET控件。我想做类似的事情。
编辑: 我正在集思广益,讨论如何为一个非常简单的数据输入应用程序创建一个非常简单的设计器。我会有一些自定义的ASP.NET数据输入控件,我希望非专业用户能够看到尽可能接近的页面。所以我希望应用程序中的一个面板显示渲染的控件集合,但面板不需要以任何方式进行交互。即没有单击和拖动或调整控件等大小。将有表单作者与之交互的标准窗体控件,用于定义页面的布局。
我将简单地保存他们添加的控件列表以及“设计人员”(非技术专家)提供的其他信息,我将使用该信息稍后通过手册创建实际的aspx页面或自动化过程,TBD。
答案 0 :(得分:7)
是的,这是可能的。
您需要为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
提供的类型的公共方法。
答案 1 :(得分: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?
答案 2 :(得分:1)
我认为这不可能,但您可以通过WebBroswer控件加载asp.net网页。
答案 3 :(得分:0)
是的,它应该是可能的。要渲染它意味着获取控件的html,我不确定如何在应用程序中使用该HTML。
答案 4 :(得分:0)
本文“Using the ASP.Net Runtime for extending desktop applications with dynamic HTML Scripts”给出了一个如何运行嵌入式ASP.net运行时的示例,该运行时超出了已接受答案中显示的内容。