我可以得到一个.ascx文件在类库中编译
本文关键字:文件 ascx 类库 编译 一个 我可以 | 更新日期: 2023-09-27 18:13:40
我知道这是不可能的;我真的在找一个变通的办法。我在.dll文件中有一堆类,它们都继承了相同的抽象HtmlGenerator
类。所有这些都是基于某些用户设置为页面的某些部分生成内容HTML。还有JavascriptGenerator
和CssGenerator
,它们的作用差不多。很像UserControl
;)
所有这些控件要么在页面上呈现,要么可以通过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'Web'WebNewFileItems'CSharp
的内容(不包括CSharpItems.vsdir)到文件夹C:'Program Files'Microsoft Visual Studio 8'VC#'CSharpProjectItems
。
C:'Program Files'Microsoft Visual Studio 8'VC#'CSharpProjectItems'CSharpItems.vsdir
,将剪贴板的内容粘贴到现有文本的下面。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
方法的一个例子。