ASP.NET:代码落后或没有代码落后?

时间:2010-01-20 00:03:18

标签: .net asp.net asp.net-3.5 separation-of-concerns

为什么有人不想使用代码隐藏文件,以便服务器端代码与标记分开?那不应该是.NET优于经典ASP的优势之一吗?

就个人而言,我认为将代码与标记混合会使代码更难理解。

我讨厌看到那些< %%> (服务器端块)与标记互相拼接,哎呀。我希望这在ASP.NET中只是为了向后兼容Classic ASP,但我总是看到MS中包含那些黄色括号的示例。

我正在尝试理解一个可供下载here的代码示例,并对为什么我执行代码时here显示的任何服务器端断点不会中断的原因感到困惑,即使我看到已在web.config中设置。因为我经常使用代码隐藏,所以我想知道在aspx中是否存在一些关于服务器端代码的问题,这些代码的处理方式不同,这使我无法调试runat = server代码。

因此。我的问题是:

1)为什么有人不想使用代码隐藏文件,以便服务器端代码与标记分开?

2)为什么我可能无法打破服务器端逻辑?

我的任何相关评论也欢迎您的见解和意见。

6 个答案:

答案 0 :(得分:9)

使用<% %>的内联代码功能不仅仅是为了向后兼容,而是.NET的一项功能,可以允许一些(相对!)清晰直接的解决方案。然而,它经常以不太理想的方式使用。同样,代码隐藏中的代码如果经常(通常实际上)以不太理想的方式使用,就像web控件一样。

代码隐藏中的代码通常不会用于separate concerns,而是在不同于传统asp的地方使用混乱的意大利面条代码。 .NET确实允许您拥有组织良好的解决方案,但是由您来实现它。在页面后面的代码中包含代码是该旅程的第一步,也就是旅程开始的地方。

至于为什么你的事件没有解雇,很可能是:

  • 事件实际上并未触发。 (您是否更改了下拉列表中的选定项目,以实际触发该事件?)
  • 您实际上没有连接事件。在该控件的属性窗口中,是否列出了与相关事件对应的事件函数名称? (这是最简单的方法;例如,您也可以使用vb中的句柄键)
  • 通常当我的事件没有被触发时,因为我做了一些愚蠢的事情,比如没有启动我的代码,或者我的网址指向错误的地方。

答案 1 :(得分:2)

1)我想如果你习惯于开发经典的ASP,那么这是一个简单的过渡。

2)如果没有看到你的标记,我就无法告诉你你的问题是什么。如果您没有达到该断点,可能有以下几个原因之一:

  1. 可能会禁用调试
  2. 事件未发生
  3. 标记中没有任何内容告诉控件您的方法是否作为事件的处理程序。

答案 2 :(得分:2)

大多数MS示例中使用的括号通常用于函数调用或引用数据透视表。

例如,<%# Databinder.Eval("MyColumn") %>将用于转发器。

还有一些标记用于引用web.config属性,例如连接字符串<%$ConnectionStrings:NorthwindConnection %>

答案 3 :(得分:1)

很多时候,“示例”ASP.NET代码与内联代码一起分发,因为它更容易以这种方式分发。它是独立的,您可以将其复制并粘贴到记事本中,将其作为.aspx保存在测试站点的文件夹中,并查看它是如何运行的。这可能不是你想要在制作中做的事情。

至于更一般的问题...... ASP.NET MVC在技术上仍然是ASP.NET,不使用代码隐藏文件。许多开发人员认为代码隐藏文件只是将一种丑陋的东西换成了另一种;个人而言,我可以从双方看到它,但我认为在经典ASP中如此糟糕的代码的真正原因不是标签汤,而是人们在“视图”代码中做疯狂的事情,比如打开数据库连接。只要你不做那种事情,一些服务器标签根本不是什么大问题。

事实上,如果你进行任何数据绑定,你将会有一堆EvalBind标签与标记混合在一起。因此,即使是具有代码隐藏功能的纯WebForms并不总是干净利落。

答案 4 :(得分:0)

  

2)为什么我可能无法打破服务器端逻辑?

当您开始调试时,构建可能会失败,并且您没有注意到选择运行上一个版本。您的断点可能不存在于该构建中。

答案 5 :(得分:0)

<%# DataBinder.Eval("Column") %>可以从后面的代码中为您节省大量额外代码,而且在我看来,这并不是很糟糕。