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

C# 我可以在类库中编译.ascx文件吗?,c#,asp.net,.net,C#,Asp.net,.net,我知道这是不可能的;我真的在寻找解决办法。我在一个.dll文件中有一堆类,它们都继承了相同的抽象HtmlGenerator类。所有这些都是根据特定的用户设置为页面的某些部分生成内容HTML。我还有JavascriptGenerator和CSSGGenerator,它们做的事情基本相同。很像用户控件 所有这些控件要么在页面上呈现,要么可以通过AJAX调用加载 我遇到的问题是,字符串包含了大量的数据,而且放入字符串有点难看。如果我能把它们放到.ascx文件中就好了 我知道ascx文件不能放在类库中,

我知道这是不可能的;我真的在寻找解决办法。我在一个.dll文件中有一堆类,它们都继承了相同的抽象HtmlGenerator类。所有这些都是根据特定的用户设置为页面的某些部分生成内容HTML。我还有JavascriptGenerator和CSSGGenerator,它们做的事情基本相同。很像用户控件

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

我遇到的问题是,字符串包含了大量的数据,而且放入字符串有点难看。如果我能把它们放到.ascx文件中就好了

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

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

试一试:

关闭VS.NET 2005。 打开目录C:\Program Files\Microsoft Visual Studio 8\Web\WebNewFileItems\CSharp(假定默认安装了VS.NET)。 在记事本中打开CSharpItems.vsdir文件。选择文本并将其复制到剪贴板。 现在打开文件C:\Program Files\Microsoft Visual Studio 8\VC\CSharpProjectItems\CSharpItems.vsdir并将剪贴板的内容粘贴到现有文本下面。 现在,将C:\Program Files\Microsoft Visual Studio 8\Web\WebNewFileItems\CSharp的内容复制到C:\Program Files\Microsoft Visual Studio 8\VC\CSharpProjectItems文件夹中。 下面是斯科特·古思里(Scott Guthrie)的一篇帖子,可能也会有所帮助:

我创造的东西几乎就是为了这个目的。该项目命名为,并在BSD许可下托管在GitHub。这段代码不是一个T4文件中最具可读性的代码,可以与Mono和.Net一起使用,但在我的网站上它对我很有用

它使用T4创建静态编译视图。因此,您只需创建一个名为Templates或其他名称的文件夹,将EViewGenerator.tt文件放入其中,然后添加HTML文件或其他您想要的文件。它将把它们处理成一个非常简单的C普通旧对象。例如,您可以将TestFile.html与以下内容放在其中:

{@ Title as string; @}
<html><head>
<title>{=Title=}</title>
<body>
Hey check out the dynamic title
</body>
</html>
我创建它是为了解决您描述的几乎完全相同的问题,所以我想也许它值得一看,即使它不是最完整的解决方案

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

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

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方法的一个例子。

可以,但是您使用的是什么版本的ASP.NET?@James 2.0(我想是在服务器上)。非常旧的服务器,但是我有VS2010,我正在用.NET3编写这个站点。5@SLaks,我见过很多关于剃须刀的事,但我以前从未调查过。到现在为止,我自己似乎都不需要它。你能给我一些有用的提示或链接吗?有什么快速的指示吗?对不起,詹姆斯,我真的不知道你想从这里得到什么。这应该做什么?它允许您从类库访问web控件。VS2010可能略有不同。这就是为什么我问你使用的是什么版本的ASP.NET。我想应该问一下你使用的是什么版本的VS;不管怎样,我还是要试一试。我应该能找出不同的地方,看起来很不错。看起来和剃须刀很像。但我需要一个关键特性;它有某种foreach循环功能吗?@Connell文档有点缺乏,但是文档很无聊!:但是我包括了一个foreach循环的例子。
{!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());
public interface IHtmlGenerator
{
    void Load(User user);
    void RenderControl(HtmlTextWriter writer);
}