2011-06-24 26 views
5

我注意到ASP.NET MVC的TextAreaFor HTML助手中最煩人的(可能的)錯誤。出於某種原因,HTML助手會在textarea中的任何內容之前添加一個NewLine。顯然,這是爲了打破個人內容可能出現的故障問題,並且瀏覽器根據規範忽略它。ASP.NET MVC Textarea HTML助手在使用AntiXssLibrary時添加行

然而,加入它,我得到了更多的惱人的錯誤,現在我的所有文字區域的自動對窗體加載任何內容之前一個額外的行(即這表明了在這個領域的任何內容之前: ) 。看起來有些東西在吐出之前正在對「換行符」進行編碼。

任何人都有解決方法嗎?我想到的是,預期的行爲是爲它打印出來

<textarea> 
    Stuff</textarea> 

不是

<textarea>&#13;&#10;Stuff</textarea> 

我越來越...

編輯 經進一步檢查,它出現這是由於我使用AntiXssLibrary進行編碼而不是默認的HtmlEncoder。我使用的4.0版本,和我的編碼器類方法是這樣的:

protected override void HtmlEncode(string value, TextWriter output) 
    { 
     output.Write(Microsoft.Security.Application.Encoder.HtmlEncode(value)); 
    } 

所以我的想法是,既然TagBuilder類,它從TextAreaHelper叫,HTML編碼標籤的內容,它是假設默認HTML編碼器的行爲,但AntiXssLibrary更徹底,因此您會看到這種行爲?

+0

我測試了我們的工作MVC3的網站之一,並沒有看到您所描述的行爲。也許你可以發佈更多信息。 – JasonG

+0

每次我開始一個新項目時,都會觸動我。順便說一句,我只看到這種行爲與FireFox,而不是IE或Chrome到目前爲止。 – mxmissile

回答

8

做了一些代碼挖掘之後,我發現我的想法是正確的。該MVC3文本區域HTML輔助使用TagBuilder類,並執行以下操作:

tagBuilder.SetInnerText(Environment.NewLine + value); 

由於SetInnerText呼籲HttpUtility.Encode傳遞給它的參數的內容,這將導致在默認編碼被稱爲不只是在實際值,但在此Environment.NewLine上,也就是說,如果您沒有使用默認的HtmlEncoder(而不是AntiXssLibrary),則可能會出現一些意外的行爲,如此。

的修復將是他們,而不是撥打:

tagBuilder.InnerHtml = Environment.NewLine + HttpUtility.Encode(value); 

我已經提交bug報告。

在此同時,我實現一個JavaScript的onload修復從所有文字區域拆除違規編碼:

$("textarea").each(function() { $(this).val($(this).val().trim()); }); 
+1

感謝這幫了我(+1),但我不得不將js更改爲$(「textarea」)each(function(){$(this).val($。trim($(this).val()) );});讓它在ie8中工作(請參閱http://stackoverflow.com/questions/3439316/ie8-and-jquerys-trim) – Adam

+1

您是否有針對您提交的錯誤的URL?我想跟蹤這個問題,因爲這個問題正在影響我們。 – Jacob

+1

http://aspnet.codeplex。com/workitem/8848 –