我是否走在正确的道路上?(ASPX、ascx、设计)

4
我有几个网页,每个页面都差不多。它们中的每一个都在顶部有一个员工部分。下一个部分是客户部分,再下一个部分是之前的订单。这两个部分并不是所有页面都必须有的。最后一个部分是评论(博客)。
我最初有两个页面,没有问题。我为每个页面编写了相同的代码(复制粘贴),稍微调整了一些细节。销售人员把这个交给了客户,客户变得越来越饥渴……现在我有了10个具有更或少相同代码的页面。
现在我想通过重用相同的“控件”来减少开发时间。所以我开始做一些ascx(4),想着可以将这4个控件与每个页面(员工、客户、销售、博客)一起重用。
但我遇到了一点问题,谷歌告诉我——“不,那不是你使用ascx的方式”。一个ascx只是一个新的“asp:label” / “asp:textbox”,可能会带有一些额外的逻辑。
问题在于——我在NewTest.aspx中使用了这4个控件,但我没有看到控件中的asp:formview / asp:detailsview等内容。我可以在formview的周围放置“hello world”,就在之前、之后,但不能在<formview></formview>内部。
我该怎么做?需要重新考虑什么?
    <table width="800">
        <tr>
            <td>
                <IIT:EmployeeRecord ID="test1" runat="server" />
            </td>
        </tr>
     </table>

我使用ObjectDataSource从Session中获取员工ID。员工记录包括他的姓名、一个下拉菜单(仅限销售代表)和一个搜索框。基本上是一个带有一些额外逻辑的文本框。
所有底层逻辑(BLLs、DALs、Models等)都完全相同。项目的其余部分编译和运行与我开始使用ascx之前完全相同。
编辑:我正在努力将KSS应用于此,如果我能够显示EmployeeRecord,则可以复制粘贴该想法。
从webconfig开始:
<pages>
<controls>
    <add tagPrefix="IIT" tagName="Comments" src="~/DynamicData/FieldTemplates/Comments.ascx" />
    <add tagPrefix="IIT" tagName="OrderRecord" src="~/DynamicData/FieldTemplates/OrderRecord.ascx" />
    <add tagPrefix="IIT" tagName="CustomerRecord" src="~/DynamicData/FieldTemplates/CustomerRecord.ascx" />
    <add tagPrefix="IIT" tagName="EmployeeRecord" src="~/DynamicData/FieldTemplates/EmployeeRecord.ascx" />
  </controls>
</pages>

智能感知可以识别EmployeeRecord和OrderRecord,但不能识别Comments和CustomerRecord。编辑:现在智能感知已经能够识别所有这些。

EmployeeRecord

<asp:formview ID="fv_empDetail" runat="server" datasourceID="ods_empDetail">
<itemtemplate>
<table>
    <tr>
        <td>
        Medarbejder:
        </td>
    <td>
<asp:TextBox ID="tbEmployeeName" runat="server" ReadOnly="true" Text='<%# Bind("name") %>' BorderStyle="None"></asp:TextBox>
</td></tr>
</table>
</ItemTemplate>
</asp:FormView>
    <asp:ObjectDataSource ID="ods_empDetail" runat="server" SelectMethod="GetEmployee"
     TypeName="xxxxxx.EmployeeBLL">
     <SelectParameters>
         <asp:SessionParameter Name="employee" DbType="String" SessionField="employee" />
     </SelectParameters>
 </asp:ObjectDataSource>

(任何拼写错误都是为了您的乐趣而存在;),实际代码中没有拼写错误)

1
听起来你做得很对;复制粘贴10个表单(然后变成50个...再变成100个... :D)将是一场噩梦,重构为通用代码绝对是最佳实践。但是,我不确定如何在没有更多信息的情况下解决这个问题:你能否创建一个演示项目来展示你所说的内容并提供代码?这将使我们有能力具体查看问题,而不仅仅是试图从文本描述中找出如何重现它。 :) 谢谢! - shelleybutterfly
如果我可以给你一点建议的话。既然你似乎非常致力于使用架构模式、组织代码、将“正确的东西放在正确的位置”等等,那么建议你看看 asp.net MVC 作为你的表现层。它提供了更符合 Web 标准的方法、可测试性,以及其他诸多优点。如果你需要更多说服,请注意 Stack Overflow 和整个 Stack Exchange 网络都是使用 asp.net Mvc 构建的 :) - Matteo Mosca
3个回答

2

使用MasterPage来完成你的项目。如果你认为有一些通用的特定页面信息,不考虑其他页面组,则对这些特定页面组使用嵌套的masterpage。

使用嵌套的masterpage可以保持根masterpage的轻量化,并为其他页面提供服务。

你也可以按照@Umar给出的链接开发用户控件,或者参考以下链接:

创建ASP.NET用户控件

我的用户控件


“我的用户控件”给了我正确方向的提示。让我再进行一些测试。 - DoStuffZ

0
如果我正确理解了您的问题,您想要做的是在自定义控件中放置 Web 控件(自定义或其他)。
我认为您想要做的是创建模板化的 ASP.NET 控件。请参阅文章如何:创建模板化的 ASP.NET 用户控件
这将使您能够在 ASPX/ASCX 文件中编写以下内容。
<uc:TemplateTest runat="server">
  <MessageTemplate>
    <asp:Label runat="server" ID="Label1" Text='Foo!!' />
    <br />
    <asp:Label runat="server" ID="Label2" Text='Bar!!' />
    <hr />
  </MessageTemplate>
</uc:TemplateTest>

NB:此示例已从上述文章进行了调整。

请注意,在uc:TemlpateTestMessageTemplate元素内存在两个asp:Label标记。


0
为什么不创建一个包含所有页面共有信息的主页面,然后只填写特定页面的信息呢?

我的上一个在SO上的问题得到了这样的建议,那就是不要把太多的逻辑放进主页面中。这个想法听起来很不错。我会考虑的。 - DoStuffZ
@DoStuffZ - 你认为你的母版页会有什么样的逻辑? - Charles Boyung
@Charles Boyung - 很好的问题,尽可能少地处理。半静态、布局默认值等。 - DoStuffZ
@DoStuffZ - 我不明白为什么这些内容不能放在主页面及其代码后面。我查看了您提到的另一个问题,他并没有真正谈论不再使用主页面,他只是说逻辑应该在主页面的代码后面文件中,这对于Asp.Net来说是很好的实践 - 几乎所有的逻辑都应该在.cs文件中,而不是.aspx/.ascx/.master文件中。 - Charles Boyung

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