使用Visual Studio创建非aspx代码后置页面

3
我希望能够建立自己的“代码后台”,以便我可以在HTML文件中有HTML,而在cs文件中有代码,但是仍然能够在HTML文件中使用智能提示功能。 (我知道这就是.NET页面类所做的,但我想要更轻量级的东西)
例如,在.html文件中:
<%@ Directive classname="HTMLSnippet" %>
<html>
   <body>
     <div>[%message%]
   </body>
</html>

而且在一个 .cs 文件中

public class MyClass : HTMLSnippet
{
   public class MyClass () {
      snippet.message = "message goes here"
   }
}

所以我的问题是如何创建HTMLSnippet类,使其成员自动创建,并在我添加令牌到.html文件时显示在Intellesense中?我知道.net目前通过创建designer.cs文件并基本上构建一个包含页面所有元素的类来实现这一点,这很好,但我如何让Visual Studio在编译之前生成它,以便它显示在Intellesense中。谢谢!
澄清:我还没有将其用作处理程序,我想使用它来使带有令牌的HTML片段作为具有属性的对象在代码中可用,就像自定义控件一样。我认为我必须创建一个VS插件,等待我在.html文件中键入令牌,然后自动创建每个令牌的成员的.cs文件。

请解释一下“它的膨胀和开销对我来说太丑陋了”的意思。如果您不需要/不想要,您可以编写自己的处理程序而不是页面处理程序,并删除可能存在的任何“膨胀”。 - Chris Ballance
我正在编写自己的处理程序,但我不想将 HTML 代码放入处理程序中,我希望仍然将 HTML 代码放在一个 .html 文件中。 - missaghi
如果你想尝试复制“designer.cs”文件的功能,请查看VS 2010中的T4模板。 - Nelson Rothermel
5个回答

2
首先,如果您不想要冗余代码,ASPX页面中并没有很多冗余代码。您可以除去几乎所有内容,除了@ Page指令标记。如果您不想在客户端上有冗余代码,您也可以关闭视图状态,因此我认为没有必要重新发明轮子。
如果您想要更少的冗余代码,请考虑使用ASP.NET MVC。如果我猜得对的话,您将在MIX会议上看到RTM版本的发布,因为微软喜欢在会议上发布新产品。如果不是的话,那么RC2版本已经发布,RTM版本也就不远了。在ASP.NET MVC中,ASPX页面可以非常简单,因为它们只是视图。
如果您想以自己的方式解决这个问题,您可以使用HTTP处理程序来处理该类型。我不建议将其保留为.htm或.html文件,因为这样会使您无法在服务器上提供标准的.html文件,这是不好的。这解决了处理问题,但只解决了一半的问题。
我不确定如何处理Intellisense。一种方法是参考Stagner的博客所示: http://weblogs.asp.net/joestagner/archive/2008/05/12/add-custom-javascript-intellisense.aspx 虽然我没有尝试过自定义扩展,但它应该可以工作。你也可以创建自己的自定义XSD(XML)文件,比如: http://vyasashutosh.blogspot.com/2007/05/providing-custom-intellisense-in-vsnet.html 个人而言,我会使用ASPX模型并清除掉不需要的内容。你甚至可以删除模板,这样就可以在每个页面上进行操作了。你无法摆脱@ page指令,但如果那太多的负担,我不确定ASP.NET是否是你想要使用的模型。

我喜欢人们对UI.Page类有所争议,嘿,对于处理程序、模块和ui.Page(控件...)我非常熟悉。我打算重新发明轮子,但要做出改进(例如橡胶胎、钢质轴承...)。感谢提供的链接! - missaghi
创建自定义XSD看起来很酷,但是我如何在IDE中打字时让Visual Studio构建一些XSD呢? - missaghi

1

虽然我不同意你的观点,但是你可以在代码后端创建受保护的变量,并以你想要的方式使用它们。

在代码后端:

protected string myVar1 = "Hello World"

在HTML中:

<html>
   <body>
     <div><%= myVar1 %>
   </body>
</html>

再次强调,这种工作方式是倒退了一步,我建议不要使用。


这在 .html 文件中是行不通的,Visual Studio 不会解析 html 文件,也不会将这些变量暴露在与代码后面的类相同的级别上。但还是谢谢你提供答案,即使你不同意 :) - missaghi

1

尝试使用MVC框架

否则,使用PHP、DJANGO、ROR或其他完全支持模板的框架。


0

或者尝试使用ASP.NET的Spark,它试图通过使用XML标记来消除内联脚本标记的需要。IE

<% foreach( string key in collectionOfItems.Keys ) %>
<div><% =key %></div>
<% } %>

变成了类似于

<foreachcollectionOfItems.Keys >
<div>$key</div>
</foreach>

注意我的例子不好也不正确,但你可以理解思路。谷歌一下...Spark


0

我相信如果您从抽象的UI.TemplateControl类继承您的类,您将获得此功能。我正在浏览接口,看看是否仅实现特定接口就可以为您提供此功能,但是,我猜想如果您想要这个功能,这就是您需要做的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接