我可以在类库中编译.ascx文件吗?

时间:2011-11-07 21:29:41

标签: c# asp.net .net

我知道这是不可能的;我正在寻找一个解决方法。我在 .dll 文件中有一堆类,它们都继承了相同的抽象HtmlGenerator类。所有这些都是基于某些用户设置为页面的某些部分生成内容HTML。我也有JavascriptGeneratorCssGenerator,这几乎完全相同。很像UserControl;)

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

我遇到的问题是字符串包含很多",并且放入字符串会变得有点难看。如果我能将它们变成 .ascx 文件,那就太好了。

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

您可以继承UserControl并覆盖类库中的Render方法,但有没有办法让 ascx 文件在类库中编译?或者有足够的解决方法吗?也许我应该把HTML放在资源文件中?

3 个答案:

答案 0 :(得分:1)

试一试:

  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
  6. 这是Scott Guthrie的一篇文章,也可能有所帮助:
    http://webproject.scottgu.com/CSharp/UserControls/UserControls.aspx

答案 1 :(得分:0)

我已经为这个目的创造了一些东西。该项目名为EView,并在BSD许可下托管在GitHub。代码不是最易读的(所有代码都填充到一个T4文件中以与Mono和.Net一起使用),但它在我的网站上适用于我。

它使用T4创建静态编译的“视图”。因此,您只需创建一个名为“Templates”(或其他)的文件夹,将EViewGenerator.tt文件放入其中并添加HTML文件(或您想要的任何文件)。它会将它们处理成一个非常简单的渲染C#plain-old-object。例如,您可以使用以下内容放置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类似的“布局”

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());

答案 2 :(得分:0)

我自己找到了一个很好的方法,我将与大家分享。我很欣赏这些答案。

我将HtmlGenerator更改为接近以下界面:

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

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

真的很简单..我添加了另一个Web项目,让所有UserControl类继承IHtmlGenerator。 UserControl已经有void RenderControl(HtmlTextWriter writer)的定义,因此只是添加Load方法的情况。