【问题标题】:Am I on the right track (ASPX, ascx, design)我在正确的轨道上吗(ASPX、ascx、设计)
【发布时间】:2011-07-13 10:04:15
【问题描述】:

我有几个网页,每个网页都或多或少相同。他们每个人的顶部都有一个员工部分。下一部分是客户部分,之后部分是以前的订单。这两个在所有页面上都不是绝对必要的。最后一节是 cmets(博客)。

我从 2 页开始,没问题。我为每个页面编写了相同的(复制粘贴)代码(提供或获取一些细节)。销售给(诱饵)这个给客户,客户饿了.. more more MORE... 现在我有 10 页或多或少相同的代码。

现在我在想是否可以通过重复使用相同的“控件”来减少开发时间。所以开始做一些 ascx (4),认为我可以在每个页面(员工、客户、销售、博客)中重用这 4 个控件。

我遇到了一个小问题,谷歌告诉我 - “不,不,这不是你使用 ascx 的方式”。 ascx 只是一个新的“asp:label”/“asp:textbox”,其中可能包含一些额外的逻辑。

Snatch being - 我制作了一个包含 4 个控件中的每一个的 NewTest.aspx,但我没有从控件中看到 asp:formview / asp:detailsview 等。我可以在 formview 周围放置“hello worlds”,就在之前,就在之后 - 但不能在 <formview></formview> 内。

我哪里错了,我需要重新考虑什么?

NewTest.aspx

    <table width="800">
        <tr>
            <td>
                <IIT:EmployeeRecord ID="test1" runat="server" />
            </td>
        </tr>
     </table>

我使用 ObjectDataSource 并从 Session 中提取员工 ID。员工记录 - 他的姓名、带有他的邮政编码的下拉列表(仅限销售代表)和搜索字段。基本上是一个带有一些额外逻辑的文本框。

所有底层逻辑(BLL、DAL、模型等)都完全相同。项目的其余部分编译和运行与我开始使用 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>

Intellisense 可以识别 EmployeeRecord 和 OrderRecord,但不能识别 Comments 和 CustomerRecord。 编辑:Intellisense 现在可以识别它们。

员工记录

<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>

(任何拼写错误仅供您欣赏;),真实代码中没有拼写错误)

【问题讨论】:

  • 对我来说听起来你绝对是在正确的轨道上; 10 种剪切和粘贴形式(螺旋成 50...然后 100...:D)将是维护的噩梦,重构为通用代码绝对是最佳实践。但是,如果没有更多信息,我不确定如何解决这个问题:有什么方法可以创建一个演示项目来演示你在说什么并提供代码?这将使我们能够具体地查看和查看问题所在,而不仅仅是试图找出如何从文本描述中重现问题。 :) 谢谢!
  • 如果我能给你一点建议。由于您似乎真的致力于使用架构模式、组织代码、“在正确的地方做正确的事情”等,请查看 asp.net MVC 的表示层。它提供了更符合 Web 标准的方法、可测试性等等。如果你需要更有说服力,stackoverflow 和整个堆栈交换网络都是用 asp.net Mvc 构建的 :)

标签: c# asp.net ascx


【解决方案1】:

为您的项目使用 MasterPage。如果您认为某些常见的特定页面组的信息与其他组无关,请为这些特定的页面组使用嵌套母版页。

使用嵌套母版页将使您的根母版页保持轻量级,并且也可用于其他页面。

您也可以按照@Umar 给出的开发用户控件的链接或参考以下内容:

Create ASP.NET user control

My User Control

【讨论】:

  • “我的用户控制”让我朝着正确的方向前进。请允许我再测试一下。
【解决方案2】:

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

【讨论】:

  • 我之前关于 SO 的问题给了我一个建议,即永远不要在母版页中加入那么多逻辑。想法听起来不错。我会考虑的。
  • @DoStuffZ - 您认为您的母版页中会有什么样的逻辑?
  • @Charles Boyung - 好问题,尽我所能。半静态、默认布局等。
  • @DoStuffZ - 我不明白为什么不应该进入母版页及其背后的代码。我查看了您引用的另一个问题,他并没有真正在母版页中谈论,他只是说逻辑应该在母版页的代码隐藏文件中,这对 Asp.Net 来说是一个很好的做法一般来说 - 几乎所有逻辑都应该在 .cs 文件中,而不是 .aspx/.ascx/.master 文件中
【解决方案3】:

如果我正确理解了您的问题,那么您要做的是将 Web 控件(自定义或其他)放置在您自己的自定义控件中。

我认为您要做的是创建模板化的 ASP.NET 控件。请看文章How to: Create Templated ASP.NET User Controls

这将使您能够在 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>

注意:这个例子改编自上面链接的文章。

注意两个asp:Label 标签如何存在于uc:TemlpateTestMessageTemplate 元素中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-09
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    相关资源
    最近更新 更多