2012-12-13 91 views
1

我有一個典型的C#自動屬性。當我只得到一個get時,如何應用WebUtility.HtmlDecode();組;?格式化自動屬性的語法

UPDATE:

好,一天的愚蠢的錯誤。我有一個奇怪的問題,其中我的web.config數據庫連接字符串被指向正確的服務器,但由於某些原因,因爲我有2個實例(一個SQL 2008年和2012年),它仍然拿起該數據庫在2008年的實例,編碼仍在那裏。我通過在2012年DB中創建的單元測試來解碼Title,解決了編碼問題,在這種情況下,整個fing的帖子在堆棧中是不必要的,因爲最終的問題是它從舊的DB中讀取(弄亂了我) 。

反正我已經解決了這個問題,終於擺脫了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 
    }  

所以我不認爲我需要的解碼afterall..I已經做到了!

+0

附註:我認爲做一些讓屬性設置爲不匹配的屬性通常是個不好的主意,它被設置爲'item.Prop = value; if(item.Prop!= value){WHY ??? ''。 (給Kuya John +1的方法)。 –

+0

屬性的值一旦設置就不應該改變。這就是你的方法。 – Jeroen

+0

出於好奇。 htmlencoded文本來自哪裏? – Jeroen

回答

0

你真的不想通過屬性來做HTML編碼/解碼,雖然你可以如果你想。有幾個問題是:

  1. 你會採取這一編碼/解碼擊中財產的每一個訪問,無論是讀取或寫入。
  2. HTML編碼/解碼是一種「有損」的轉換,你只想每個字符串只做一次;當您在多個屬性上進行折騰時,您不希望經常編碼和解碼並重新編碼相同的字符串,否則您將開始以這種方式丟失信息。
  3. 內容的HTML編碼不是您存儲它的對象的屬性,它是內容本身的屬性。

你真正想要做的是使用代表HTML編碼字符串的更強類型。 .NET 4.0。0框架包含您應該用於此目的的System.Web.HtmlString類型。實際上,如果您希望保持一般性,請使用System.Web.IHtmlString界面。

+0

sh **我剛剛意識到它是從我本地數據庫的副本中讀取的。所以我不需要解碼,因爲我已經通過我創建的單元測試修復了問題,以便在其上執行WebUtiilty.HtmlDecode,並且已經在數據庫中更新了這些值。所以當我不需要時,我添加了Decode,因爲它是從編碼仍然存在的DB的舊副本讀取的。啞。但很好的信息,給你答案。 – PositiveGuy

3

你不能,我認爲。這樣做的唯一方法是有格式的值,並將其分配給屬性不能用魔法getter和setter自動做一個單獨的方法,前

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); 
} 
-1

。您需要創建自己的私有財產,並將其用作公共財產的後備商店。

例子:

private string _Item; 

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

然而,其他的這個問題的答案是正確的,這可能是一個壞主意。例如,如果您的代碼曾經在HTML應用程序之外使用過,則必須在設置此屬性之前對所有文本進行HTML編碼。

+0

糟糕的編碼技術。看到我的答案。 – Jeroen

+0

@Jeroen,但至少我回答了這個問題。你說「不要這樣做」,我承認這可能是最佳做法,但不是對問題的回答。 –

+0

@MosheKatz廢話。 「不要這樣做」對於如何做不好的事情是一個完全可以接受的答案。 –

1

屬性的值一旦設置就不應該改變。它應該返回您設置的相同值。這就是爲什麼它被稱爲財產。在設置屬性值之前,請致電HtmlDecode

如果其他人使用您的課程並且無法訪問您的源代碼,那麼在設置屬性值時他們不會想象您正在進行任何類型的處理。

+0

使用/實現像HtmlString這樣更強大的類型來表示編碼是一個好得多的解決方案,它比心理上跟蹤傳遞給多個函數的字符串的編碼狀態要好得多。 –