【问题标题】:Is there a best practice for string replacement in .aspx pages?.aspx 页面中的字符串替换是否有最佳实践?
【发布时间】:2009-03-25 13:11:52
【问题描述】:

我有一个 .aspx 页面设置。我有很多占位符需要更换。名字、姓氏、城市、州等。我如何才能有效地做到这一点?

放下一堆……

<asp:Label runat="server" id="Label_FirstName" Text="" />

...无处不在?

或者有没有办法在普通页面区域使用数据绑定语法:

<% FirstName %>

提前致谢!

【问题讨论】:

    标签: c# asp.net data-binding templates replace


    【解决方案1】:

    注意

    <asp:Label runat="server" id="Label_FirstName" Text="" />
    

    将转义您的字符串(例如,将 替换为 < 和 >),但是

    <%= FirstName %>
    

    不会。如果这是您的意图,那很好,但请注意,您可能会为XSS attacks 打开一个频道。要正确转义字符串,您可能需要

    <%= System.Web.HttpUtility.HtmlEncode(FirstName) %>
    

    改为。

    【讨论】:

    • Josh:你当然可以 - 但是你必须确保属性的值不会被写入任何非直接 HTML 输出,如数据库或文本文件,甚至另一个 HTML 控件,因为 ASP.NET 将再次对其进行转义。
    • 好点 Josh,好点 DrJokepu。甚至创建一个在检索时对元素进行 HTMLEncode 的自定义集合是否有意义?这应该不难,只需将其命名为“HtmlASPXPropertyCollection”之类的明显名称。然后让集合成为表单上的一个属性!
    【解决方案2】:

    你当然可以使用:

    <%= FirstName %>
    

    FirstName 是页面的属性。它不一定是类中的属性,您可以从该行访问几乎任何内容。

    更新: 正如 DrJokepu 指出的,如果您显示的数据来自用户输入,那么它会打开 XSS 漏洞。正如所指出的,您使用 HtmlEncode 来避免这种情况,在这种情况下,更短的语法将是:

    <%= Server.HtmlEncode(FirstName) %>
    

    如果你有一个基本页面,你可以定义一个方法并逃脱:

    <%= HtmlEncode(FirstName) %>
    

    如果您使用 asp.net 标签,请在适当的地方执行 EnableViewState = false,这样您就可以避免发送/接收不必要的视图状态。


    对于格式化使用 ids/css 类,并在 css 样式表中包含样式。无论内容是否动态,css都可以被浏览器缓存。


    对于信息列表,您可以使用 ListView 或 Repeaters 并仍然控制将通过网络发送的特定 html。

    【讨论】:

      【解决方案3】:

      您绝对可以使用 ASP 样式的标签 (&lt;%= %&gt;),但我认为您的第一种方法更清洁且更易于维护。当您使用 ASP 样式的标签时,您将不会进行数据绑定,而是可以访问页面的所有成员(包括字段、属性和其他方法)。

      因此,如果FirstName 是您正在处理的页面上的字段或属性,那么这两种方法都可以使用。我个人认为基于控制的方法更好,但对每个人来说都更好。

      【讨论】:

        【解决方案4】:

        我喜欢使用标签,因为它更容易混淆颜色、字体、粗体等...以显示错误或吸引用户注意某些文本。

        我通常只是在代码隐藏中有一个设置方法。

        if(!Page.IsPostBack)
                SetupForm();
        
        SetupForm()
        {
            Label_FirstName.Text = firstName;
        
        }
        

        【讨论】:

          【解决方案5】:

          如果您想对 HTML 进行更多控制,可以使用一堆标签或 Substitution 控件,甚至是 Literal Text。

          您可以在标记中使用如下代码:

          这将导致页面上名为 FirstName 的属性被调用,并将其返回值放置在标签之间。

          【讨论】:

            【解决方案6】:

            这取决于您使用它们的环境。通常使用 asp:label 控件很好,因为您可以从页面上的代码隐藏中访问它们。数据绑定方法通常在 DataGrid 或 Repeater 等数据绑定控件中使用。

            数据绑定方法的真正问题在于没有很好的 IDE 支持。为了让它工作,你必须在你的页面类上有一个属性,你需要在后面的代码中填充它,但是如果属性名称发生变化,你还必须确保更新你的 aspx 页面。如果您使用标签方法,IDE 将检测标签名称是否发生变化,或者它是否已被完全删除并给您一个编译时错误。

            或者,您可以使用 jQuery 来填充您的数据并使用 span 作为占位符。请注意,jQuery 需要一些不同的方式来考虑您的页面,因为它使用 javascript 来填充您的字段。

            【讨论】:

              【解决方案7】:

              我的经验法则是:

              • 如果我要标记输入控件,我会使用一个标签,以便我可以设置 AssociatedControlID 属性。
              • 否则我使用Literal 或Localize 控件。我一般不直接设置标签的样式,所以我不需要它们在其他情况下生成的额外标记。

              所以,在你的情况下,我可能会使用 Literal 控件。

              【讨论】:

                【解决方案8】:

                Jeff Atwood 在Coding Horror 探索了这个主题,并发现just doesn't matter 的表现...

                注意:似乎 Jeff 的帖子必须保留一粒盐,毕竟...抱歉在没有阅读 cmets 的情况下匆忙回答

                【讨论】:

                • 阅读 cmets:这些测试存在很多问题。 他的网站乍一看并不重要(非常)。
                • 谢谢 Joel,我承认自从我阅读了 Jeff 的帖子后,我就没有回去阅读 cmets...
                【解决方案9】:

                试试这个:

                <%= FirstName %>
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-01-23
                  • 2018-03-15
                  • 2010-11-10
                  相关资源
                  最近更新 更多