我很抱歉可能会对标题产生误导,但我不知道是否有合适的头衔。
随意编辑。
无论如何,我使用的是ASP.NET Web Forms,也许这不是Web表单的使用方式,但我喜欢手动构建和填充HTML元素。它让我有更多的控制权。
我不使用DataBinding和那种东西。我使用SqlConnection,SqlCommand和SqlDataReader,设置SQL字符串等,并从DataReader读取数据。 老学校,如果你喜欢。 :)
我确实创建了WebControls,因此每次我需要一些控件时都不需要复制粘贴,但大多数情况下,我需要WebControls呈现为HTML,这样我就可以将HTML附加到其他函数中,从而呈现最终输出控制在里面。
我知道我可以用control.RenderControl(writer)渲染一个控件,但这只能在(pre)Render或RenderContents覆盖中完成。
例如。
我有一个dal.cs文件,其中存储了与数据库通信的所有静态函数和空洞。 函数主要返回字符串,以便可以将其附加到其他函数中以呈现最终结果。
我这样做的原因是我想尽可能多地将编码与HTML分开,以便我不做<%while(dataReader.Read())%>在HTML中显示数据。我把它移到了CodeBehind。 我还使用这个函数在HttpHandler中呈现AJAX响应。
完美无缺,但是当我想添加一个控件(ASP.NET服务器控件(.cs扩展名,而不是.ascx))时,我不知道该怎么做,所以我看到自己编写了相同的控件作为返回字符串或该控件内的另一个函数的函数,该函数返回字符串并替换RenderContents所做的作业,这样当我需要将控件附加到另一个字符串时,我可以调用该函数。 我知道这可能不是一个很好的做法。
当我看到关于ASP.NET MVC的所有教程/视频时,我认为它满足了我的需求,就像MVC一样,你必须自己构建一切(或大部分),我现在已经在做了与网络表格。
在这个长篇介绍之后,我想问一下如何构建我的控件,以便我可以像我提到的那样使用它们(返回字符串)或者我必须忘记服务器控件并将控件构建为函数并以这种方式使用它们? 甚至可以使用ASP.NET服务器控件(.cs扩展名),或者当我说我没有正确使用它时,我是对的。
要说清楚,我正在讨论如何正确使用Web表单,但是要避免使用数据绑定器,因为我想通过自己构建所有内容(在Code Behind中呈现HTML)。
有人可能会认为我附加的字符串如“some”+“string”,我不是。我正在使用StringBuilder,所以没有慢。
欢迎提出任何意见。
答案 0 :(得分:7)
你需要停止思考“控件”和webforms。 MVC是一种完全不同的构建应用程序的方式。
我也讨厌WebForms中的自动渲染器,它们产生了可怕的html,从来没有任何意义。但是,你不想在你的代码隐藏中编写你的html并将其作为字符串传递,这只是令人讨厌的。您的演示代码与您的逻辑混合在一起,并且您在c#strings !!!中编写HTML
所以,MVC ......你可以只查看显示数据并包含允许你发布到控制器的表单,而不是使用代码隐藏和回发进行交互的“小部件”。
因此,您可以强烈地键入视图到Type,然后通过Model属性访问从控制器传递给它的数据。与UserControls等效的是部分视图(ViewUserControl),可用于模块化类型的渲染代码。例如,您可能会在每次需要渲染时传递Person的Address属性。这样你就不会在整个地方重复html了。
P.S。所有DAL的单个文件?
答案 1 :(得分:6)
我希望永远不会 永远必须处理您以这种方式撰写的应用。如果您的应用程序是字符串繁重,那么就会出现问题。
答案 2 :(得分:1)
同意@sliderhouserules,你使用MVC框架的方式很糟糕。你必须忘记所有的“旧学校”技巧。 你永远不应该在页面代码中使用SqlCommands,SqlReaders等。您应该仅向视图传递模型(例如视图(条形图)),如果您避免使用
会更好ViewData["some magic string"] = bar
每次当你使用“老派”技术时,2个男人和2只猫都会被杀死:)
另外最好使用一些ORM(对象关系映射器),如Linq2sql,NHibernate,SubSonic等。
如果您需要良好应用程序设计的样本,请查看SharpArchitecture。它有一个非常好的架构和实现,可能会有很多帮助。它有一个样本(使用Northwind数据库),很快就会添加一个样本
另请参阅CodeCampServer。它也有很好的架构
最好查看这些项目的代码,而不是查看视频,因为现有的视频无法展示出良好的架构样本,只是简单的功能使用。
关于服务器控件,如果没有'runat =“server”'就可以使用它们,就像PlaceHolder一样。您也可以创建它们,但不应直接在其中加载任何数据。如果你不想复制粘贴html,你应该检查你的代码,你应该重构它。每个重复的代码都应该移动到UserControls的MasterPages(ascx)
再一次,请花点时间看看这些样品。当您需要更新应用程序或修复某些内容时,您将在以后节省您的紧张和时间。初看起来他们很难理解,但这只是初看起来。
希望这会有所帮助。
答案 3 :(得分:0)
如果您需要ASP.NET MVC路径,可以将控件设置为ASCX,它们只是由控制器填充的标签。但是,对你来说,这可能不够老。
如果您愿意,可以在后面的代码中创建完整的UI。这可以包括在例程中创建HTML。
但是,如果您坚持使用ASP.NET,我会建议您重新考虑DataReader()和输出+循环上的绑定模型。它不仅旧式,效率低,难以维护。
ASP.NET MVC确实创建了一个更宽松的ASPX,因为它只是一个视图。并且代码和UI之间存在更大的分离。但它也不适合旧的学校模式。
答案 4 :(得分:0)
您是否考虑过使用micro-templates? Dave Ward有一个很好的例子client side data repeater,它在调用页面方法后使用微模板进行布局。听起来这更像是你想要完成的精神,并且仍然可以很好地与WebForms集成。
副作用是您不会依赖于传递HTML并且可以将您的演示文稿与逻辑隔离开来。
答案 5 :(得分:0)
@lopkiju,我认为如果您想要对输出HTML进行大量控制,MVC模式将比您当前的WebForms解决方案更好地服务于您。
您可以像现在这样使用Web窗体,但它不是以这种方式使用,因此会很麻烦。
更多细节
在我看来,阅读一些关于Separation of Concerns(也称为SoC)原则的文章。如果您正确应用它,它可以在您调试应用程序时以及与您合作的人员(例如那些可能必须阅读或修改您的源代码的人员)中为您节省许多麻烦。
我给你的另一个提示是:
你是对的,你不应该在你的View代码中做<% while (dataReader.Read()) %>
之类的事情。但也许有更好的方法让它比你现在的方式更优雅。
我认为您应该考虑将某种ORM用于这些目的。 (LINQ to SQL,甚至NHibernate。)如果你得到它,它会更简单。您可能不想再次直接使用DataReader
s了。 : - )
我建议您使用
只需阅读NerdDinner tutorial,然后逐步构建samle应用程序 之后,尝试构建一个类似的应用程序,在应用您应用于教程的相同规则和设计时,自己提供不同的用途。
我很确定你有这方面的专业知识,并且在实际使用它之后,你几乎可以感受到它。
教程还解释并包含了我上面提到的原则,这些原则对您非常有用。