1

我有一个典型的 C# 自动属性。当我只有一个 get 时,如何应用 WebUtility.HtmlDecode() ;放;?

更新:

好吧,今天的愚蠢错误。我有一个奇怪的问题,我的 web.config 数据库连接字符串指向正确的服务器,但由于某种原因,因为我有 2 个实例(一个 sql 2008 和 2012),它仍然在 2008 年获取该数据库的实例,该实例具有编码还在。我已经通过我在 2012 年数据库中创建的单元测试解码标题来解决编码问题,在这种情况下,整个 fing 帖子在堆栈中是不必要的,因为最终问题是它是从旧数据库中读取的(搞砸了我) .

无论如何,我已经修复了这个问题,终于摆脱了 2008 年的副本,现在它在我修复后可以正常阅读:

  [Test]
    public void CleanAllPostEntries_DecodeHTML_DecodeWasSuccessful()
    {
        // Arrange

        // Act
        IEnumerable<Entry> posts = PostCRUD.GetAllPosts();

        foreach (Entry post in posts)
        {
            post.Title = WebUtility.HtmlDecode(post.Title);
            post.Body = WebUtility.HtmlDecode(post.Body);
            post.MetaTitle = WebUtility.HtmlDecode(post.MetaTitle);

            PostCRUD.UpdatePost(post);

            //System.Diagnostics.Debug.WriteLine("id: " + post.Id);
            //System.Diagnostics.Debug.WriteLine("title: " + WebUtility.HtmlDecode(post.Title));
            //System.Diagnostics.Debug.WriteLine("body: " + WebUtility.HtmlDecode(post.Body));
        }

        //Assert
        // TODO: add asserts
    }    

所以我认为我毕竟不需要解码......我已经做到了!

4

4 回答 4

3

你不能,我想。唯一的方法是有一个单独的方法来格式化值并将其分配给属性,例如

private string SamplePropery {get; set;}
private string FormatMethod(string value) {}

private void SampleExecute()
{
    // format and set to property
    SampleProperty = FormatMethod("hello world");

    // get property and format the value
    string _value = FormatMethod(SampleProperty);
}
于 2012-12-13T01:58:43.370 回答
1

属性的值一旦设置就不应改变。它应该返回您设置的相同值。这就是为什么它被称为属性。HtmlDecode在设置属性值之前调用。

如果其他人使用您的类并且无法访问您的源代码,他们不会想象您在设置属性值时正在执行任何类型的处理。

于 2012-12-13T02:32:37.047 回答
0

您真的不想通过属性进行 HTML 编码/解码,尽管如果您愿意的话也可以。这有几个问题:

  1. 您将对属性的每一次访问(无论是读取还是写入)都进行编码/解码。
  2. HTML 编码/解码是一种“有损”转换,您只想对每个字符串执行一次;当您在多个属性上折腾时,您不希望不断地编码、解码和重新编码同一个字符串,您将开始以这种方式丢失信息。
  3. 内容的 HTML 编码不是您存储它的对象的属性,它是内容本身的属性。

您真正想要做的是使用表示 HTML 编码字符串的更强类型。

.NET 4.0 框架包含一个System.Web.HtmlString您应该用于此目的的类型。事实上,System.Web.IHtmlString如果您希望保持一般性,请使用该界面。

于 2012-12-13T02:36:41.043 回答
-1

你不能用神奇的 getter 和 setter 自动完成。您需要创建自己的私有财产并将其用作公共财产的后备存储。

例子:

private string _Item;

public string Item
{
    get
    {
        return _Item;
    }
    set
    {
        _Item = WebUtility.HtmlDecode(value);
    }
}

但是,这个问题的其他答案是正确的,这可能是一个坏主意。例如,如果您的代码曾在 HTML 应用程序之外使用,则必须在设置此属性之前对所有文本进行 HTML 编码。

于 2012-12-13T02:28:06.497 回答