我可以得到一个.ascx文件在类库中编译

本文关键字:文件 ascx 类库 编译 一个 我可以 | 更新日期: 2023-09-27 18:13:40

我知道这是不可能的;我真的在找一个变通的办法。我在.dll文件中有一堆类,它们都继承了相同的抽象HtmlGenerator类。所有这些都是基于某些用户设置为页面的某些部分生成内容HTML。还有JavascriptGeneratorCssGenerator,它们的作用差不多。很像UserControl;)

所有这些控件要么在页面上呈现,要么可以通过AJAX调用加载。

我遇到的问题是字符串包含很多",并且在字符串中放置有点难看。如果我能把它们放进就好了。ascx 文件。

我理解ascx文件不能放在类库中,因为对其他文件(如图像)的引用不会起作用。但是我所有的文件都是基于某些配置文件数据生成的HTML。没有任何图像,也没有任何正在发生的操作,例如编辑数据库中的值。

您可以继承UserControl并在类库中重写Render方法,但是是否有一种方法可以在类库中编译ascx文件?还是有足够体面的变通办法?也许我应该把HTML放到资源文件中?

我可以得到一个.ascx文件在类库中编译

试一试:

  1. 关闭VS.NET 2005.
  2. 打开目录C:'Program Files'Microsoft Visual Studio 8'Web'WebNewFileItems'CSharp(假设默认安装VS.NET)。
  3. 打开CSharpItems在记事本中的vsdir文件。选择文本并将其复制到剪贴板。
  4. 现在打开文件C:'Program Files'Microsoft Visual Studio 8'VC#'CSharpProjectItems'CSharpItems.vsdir,将剪贴板的内容粘贴到现有文本的下面。
  5. 现在复制C:'Program Files'Microsoft Visual Studio 8'Web'WebNewFileItems'CSharp的内容(不包括CSharpItems.vsdir)到文件夹C:'Program Files'Microsoft Visual Studio 8'VC#'CSharpProjectItems

Scott Guthrie的一篇文章可能也会有所帮助:
http://webproject.scottgu.com/CSharp/UserControls/UserControls.aspx

我创建的东西几乎就是为了这个目的。该项目名为EView,它在BSD许可下托管在GitHub上。代码不是最易读的(所有塞进一个T4文件与Mono以及。net工作),但它适用于我在我的网站。

它使用T4来创建静态编译的"视图"。所以你只需创建一个名为"模板"的文件夹(或其他),放置EViewGenerator。并添加HTML文件(或任何您想要的文件)。它将把它们处理成一个非常简单的c# plain-old对象。例如,您可以在其中放置TestFile.html,内容如下:

{@ Title as string; @}
<html><head>
<title>{=Title=}</title>
<body>
Hey check out the dynamic title
</body>
</html>

然后当你要把它渲染为文本时,你只需要这样做:

var view=new TestFile();
view.Title="Some Title";
Response.Write(view.EViewRender()); //render returns a string

我创建它几乎完全是为了解决你所描述的问题,所以我想也许值得一看,即使它不是最"完整"的解决方案。

一些没有很好记录的东西包括foreach功能:

Foreach test: <br />
{#
  var strings=new String[]{"Foo","Bar","Biz"};
#}
{!foreach s in strings!}
  s is equal to {=s=} <br />
{!end!}

和类似于MasterPages

的"layouts"

MasterLayout.html:

{@
  Content as IEView;
  Comments as IEView;
  Title as string;
@}
<html>
<head><title>{=Title=}</title></head>
<body>
<div class="content">
  {= Content =}
</div>
<div class="comments">
  {= Comments =}
</div>
</body>
</html>

,然后是一个示例内容。

MyContent.html:

{!layout MasterLayout!}
{!layout_field Content!}
This is some example content!

和渲染:

var v=new MyContent();
v.Layout.Title = "My content";
v.Layout.Comments = new SomeCommentView();
Response.Write(v.EViewRender());

我自己发现了一个很好的方法,我将与大家分享。我很欣赏你的回答。

我将HtmlGenerator更改为接近以下内容的接口:

public interface IHtmlGenerator
{
    void Load(User user);
    void RenderControl(HtmlTextWriter writer);
}

然后我更改了将HTML读取为字符串的代码,以从StringWriter对象生成HtmlTextWriter,该对象可以使用RenderControl方法填充HTML。

这真的很简单…我添加了另一个web项目,让所有的UserControl类继承IHtmlGenerator。UserControl已经有了void RenderControl(HtmlTextWriter writer)的定义,所以这只是添加Load方法的一个例子。