2013-07-11 18 views
8

MVC4 chế độ xem dao cạo. Cho rằng một chuỗi backgroundImage được thiết lập như thế này:@ Html.Raw nhấn mạnh vào mã hóa báo giá

backgroundImage = string.Format("background: url('{0}') top left no-repeat;", project.MainImage); 

Tại sao thực hiện điều này

<div class="spotlight slide teaser-text" id="@slideId" style="@Html.Raw(backgroundImage)"> 

sản xuất

<div class="spotlight slide teaser-text" id="spotlight-0" style="background: url(&#39;/media/215/spotlight01.jpg&#39;) top left no-repeat;"> 

Html.Raw, new MvcHtmlStringMvcHtmlString.Create tất cả các hành vi tương tự.

tôi sẽ mong đợi nó để sản xuất

<div class="spotlight slide teaser-text" id="spotlight-0" style="background: url('/media/215/spotlight01.jpg') top left no-repeat;"> 

(lưu ý có dấu ngoặc kép).

+0

'Html.Raw()' chỉ trả về 'HtmlString' và' MvcHtmlString' mở rộng 'HtmlString'; Tôi nghĩ những gì bạn thấy được mong đợi? – kenchilada

+0

@radium: Không; toàn bộ điểm trong số đó là ngăn chặn thoát. – SLaks

+0

Chỉ cần thử trên MVC3 và nhận được kết quả mong đợi (Tôi không có MVC4 trên máy này). Vì vậy, có thể nó đã thay đổi trong 4. –

Trả lời

3

Tôi đã xem xét tệp DLL đã biên dịch cho mẫu dao cạo có chứa đánh dấu này. Theo như tôi có thể thấy, vấn đề là điều này.

Html.Raw chuyển chuỗi thành HtmlString. HttpUtility.HtmlEncode xử lý IHtmlString trường hợp khác với các chuỗi thông thường, ở chỗ nó không áp dụng mã hóa Html.

Khi chuỗi lập trình định nghĩa được đưa ra trong bối cảnh của thuộc tính, một cuộc gọi được thực hiện để

this.WriteAttribute(...) 

với dữ liệu thích hợp để tạo ra các thuộc tính. Một phần của dữ liệu này là HtmlString được tạo bởi cuộc gọi đến Html.Raw. Một phần khác là một lá cờ chỉ ra rằng giá trị không phải là một chữ.

Do trạng thái cờ không theo nghĩa đen, phương pháp WriteAttribute cuối cùng gọi HtmlEncode. Nhưng nó gọi đây là không phải trên HtmlString, nhưng trên giá trị chuỗi của đối tượng này. Vì vậy, bạn kết thúc với một giá trị mã hóa HTML trong đầu ra.

Bên ngoài bối cảnh của một thuộc tính, các cuộc gọi được thực hiện để

this.Write(...) 

và điều này không gặp phải vấn đề tương tự. Vì vậy, nó có vẻ giống như một lỗi cho tôi (ít nhất là nếu tôi đã truy tìm chính xác tất cả thông qua).