【问题标题】:Sticking HTML formatting into System.String object in C#将 HTML 格式粘贴到 C# 中的 System.String 对象中
【发布时间】:2009-12-22 23:41:22
【问题描述】:

如何在 C# 中将 HTML 格式粘贴到 String 对象中?

这是我所拥有的:

c.DepartmentAbbr.ToString() + " - (" + c.DepartmentName.ToString() + ")"

其中 c.DepartmentAbbr.ToString() 和 c.DepartmentName.ToString() 都是使用 LINQ 从数据上下文中选择的字段。

这就是我真正想要的:

"<b>" + c.DepartmentAbbr.ToString() + "</b> - (" + c.DepartmentName.ToString() + ")"

所以第一个单词以粗体显示。上面只显示了带有粗体标签的文字文本和所有内容。我假设我需要使用 String.Format,但我找不到一个很好的例子来帮助我知道如何使用它来做我想做的事情。

更新

这里还有一些我认为不重要的细节,但我认为现在它们一定很重要。

这是我正在使用的控件。 ASPX 代码:

 <telerik:RadComboBox ID="rcbDepartments" runat="server" AppendDataBoundItems="True"
        AutoPostBack="true" NoWrap="true" Width="250px">
        <Items>
            <telerik:RadComboBoxItem Text="All Departments" Value="-1" />
        </Items>
    </telerik:RadComboBox>

我正在使用 C# 中的 LINQ 向该控件添加项目:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        var abbr = from c in DB.Departments
                   where c.DepartmentAbbr != "BInst"
                   select c;

        foreach (var c in abbr)
        {
            String s = String.Format("{0} - ({1})", c.DepartmentAbbr, c.DepartmentName);
            rcbDepartments.Items.Add(new RadComboBoxItem(s, c.DepartmentID.ToString()));
        }
    }
}

RadComboBoxItem 对象接受 ()、(String text) 或 (String text, String value),我使用的是后者。

【问题讨论】:

  • 请在 aspx 页面上显示您正在设置的 ASP.NET 控件以及代码背后的完整代码。喜欢: txtbox.Text = "my html string";

标签: c# asp.net string string.format


【解决方案1】:
String.Format("<b>{0}</b> - ({1})", c.DepartmentAbbr, c.DepartmentName)

这是对 C# 中字符串格式化的一个很好的参考:

http://blog.stevex.net/string-formatting-in-csharp/

【讨论】:

  • 我实际上是在做一些研究时发现的。这确实是一个很好的参考,但没有回答我的问题。
【解决方案2】:

对于任何试图在 ASP.NET MVC 中执行此操作的人...

这不起作用:

<%=String.Format(resourceString, "<b>" & Model.UserName & "</b>")%>

如您所料,粗体标签是 HTML 编码的。

但是,这是一种享受:

<%=String.Format(resourceString, MvcHtmlString.Create("<b>" & Model.UserName & "</b>")%>

【讨论】:

    【解决方案3】:
    MvcHtmlString s = MvcHtmlString.Create(String.Format("{0} - ({1})", c.DepartmentAbbr, c.DepartmentName));
    

    我认为你最好将 String s 更改为 MvcHtmlString 对象。

    【讨论】:

    • 感谢您的回复,但这个问题与 MVC 无关。
    【解决方案4】:

    我猜您正在寻找一种方法让对象c 吐出HTML 格式的字符串。

    以此为例:

    公共类 myExample : IFormattable{ 私有字符串 myExampleStr; 公共 myExample(字符串 sampleStr){ this.myExampleStr = sampleStr; } /* 实现一个 Equals() 函数 - 覆盖! */ 公共覆盖布尔等于(对象obj){ 返回真; } /* 实现一个 ToString() 函数 - OVERRIDE */ 公共覆盖字符串 ToS​​tring(){ 返回 this.myExampleStr; } /* 实现一个 GetHashCode() 函数 - OVERRIDE */ 公共覆盖 int GetHashCode(){ 返回 this.myExampleStr.GetHashCode(); } /* 这里我们实现了 IFormattable 接口 */ 公共字符串 ToS​​tring(字符串格式){ 返回 this.ToString(format, null); } 公共字符串 ToS​​tring(IFormatProvider formatProvider) { 返回 this.ToString(null, formatProvider); } 公共字符串 ToS​​tring(字符串格式,IFormatProvider 格式提供者){ if (string.IsNullOrEmpty(format)) 格式 = "G"; 如果(格式提供者!= null){ ICustomFormatter 格式化程序 = formatProvider.GetFormat(this.GetType()) 作为 ICustomFormatter; 如果(格式化程序!= null) 返回 formatter.Format(format, this, formatProvider); } 开关(格式){ case "b": return string.Format("{0}", this.myExampleStr); case "i": return string.Format("{0}", this.myExampleStr); 默认值:返回 this.myExampleStr; } } }

    假设我们像这样实例化这个类:

    myExample 示例 = new myExample("tommieb75");

    然后在对象上发出一个简单的ToString() 调用以打印出一个粗体的 HTML 标记,如下所示

    Console.WriteLine("{0}", example.ToString("b")); // 输出将是 tommieb75

    此示例用于说明如何对 ToString() 方法使用自定义参数,以便您可以使用嵌入的粗体或斜体 HTML 标记,或基于用于 ToString 的参数格式化值的任何其他方式这个类的功能。

    这能回答你的问题吗?

    【讨论】:

    • 我很欣赏这个答案,但这似乎只是我已经尝试过使用 String.Format 方法的一种更复杂的方法。问题是我正在使用 RadComboBox 控件将这些添加到其中,并且我现在很确定该控件不允许我在输入对象时对其进行 HTML 格式设置。我唯一的选择是使用一个项目模板,在这种情况下我不能这样做,因为我已经在处理一个完全不同的问题,导致我切换到我当前的方法。
    【解决方案5】:

    我认为问题出在其他地方。你是把这个字符串放在标签控件还是文字控件中?如果它是一个标签,我相信它会为你转义文本。把它放在一个 asp:Literal 控件中。顺便说一句,你不需要调用 .ToString() 这么多。您可以使用:

    "<b>" + c.DepartmentAbbr + "</b> - (" + c.DepartmentName + ")"
    

    实际上会为您调用 ToString()。

    【讨论】:

    • 您尝试使用 asp:Literal 还是尝试删除 ToString() 方法?
    • 我尝试删除 ToString() 方法。我不能使用 asp:Literal,因为我已经在组合框控件中。
    • 那才是你真正的问题。您不能在组合框中执行您正在尝试的操作。您将不得不完全使用另一个控件。
    【解决方案6】:

    随着我的研究越来越多,我几乎得出结论,我想做的事情是不可能的。我正在使用 RadComboBox 将项目粘贴到其中,但我必须在服务器端使用 LINQ 做一些古怪的事情,这样我必须使用 Items.Add 方法将项目粘贴到组合框中只接受系统。细绳。谢谢大家的帮助和cmets,但我想我只能用我在这种情况下所拥有的一切。

    这里还有一些我认为不重要的细节,但我认为现在它们一定很重要。

    这是我正在使用的控件。 ASP 代码:

    我正在使用 C# 中的 LINQ 向此控件添加项目: protected void Page_Load(object sender, EventArgs e) { 如果(!IsPostBack) { var abbr = 来自 DB.Departments 中的 c 其中 c.DepartmentAbbr != "BInst" 选择 c;

            foreach (var c in abbr)
            {
                String s = String.Format("{0} - ({1})", c.DepartmentAbbr, c.DepartmentName);
                rcbDepartments.Items.Add(new RadComboBoxItem(s, c.DepartmentID.ToString()));
            }
        }
    }
    

    RadComboBoxItem 对象接受 ()、(String text) 或 (String text, String value),我使用的是后者。我现在很确定,由于 RadComboBoxItem 的限制只接受字符串,我不能在不使用 ASPX 中的项目模板标签的情况下对项目进行 HTML 格式设置。不幸的是,对于我的情况,我不能这样做,因为这已经给我带来了一些其他问题,这就是我为什么要做我目前正在尝试做的事情的原因。

    【讨论】:

      【解决方案7】:

      如果您在网页上输出此内容 - 请尝试使用:

      Server.HtmlEncode(string)
      Server.HtmlDecode(string)
      

      方法。

      【讨论】:

      • 我实际上只是尝试过这个。不幸的是,这一切似乎只是将“”字符更改为它们的实体“<”和 >" 然后显示所有显示的字符串。
      • 这是一个危险的建议。 String.Format 处理 HTML 转义,这有助于防止 xss(跨站点脚本)。如果您使用的是 String.Format,那么您可能有一个您信任的包含 HTML 的字符串,以及一个来自用户的不应包含 HTML 的变量。 String.Format 确保变量被转义,整个字符串的 HtmlEncode/Decode 不会。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-14
      • 1970-01-01
      相关资源
      最近更新 更多