3,Razor與HTML混合輸出陷阱與技巧
屬性名稱誤判
有時候我們必須讓html內容與razor語句緊接在一起,
eg:
您好,a先生
假設變量名稱為ViewBag.Name,
您好,@ViewBag.Name 先生 //這樣輸出就只有”您好,”,后面的Name 先生被當做是viewbag的屬性去了,所以如果要解決這個問題就是
加個小括號便好,如 “您好,(@ViewBag.Name )先生”
還有一個辦法就是
用一個html標簽包起來,如“您好,<標簽>@ViewBag.Name</標簽>先生”,或者將先生用html標簽包起來,都是可以的。
未預期的額外屬性
如果想要輸出一個c#的命名空間,而輸出的部分北榮要變成razor變量,類別是System.Web.Mvc.Controller
eg:
@{
ViewBag.MvcNameSpace="System.Web.Mvc";
}
類別是@ViewBag.MvcNameSpace.Controller
結果輸出會引發錯誤,string未包含controller的定義,原因在於razor解析@ViewBag.MvcNameSpace時把Controller這段當做是@ViewBag.MvcNameSpace的一個Controller屬性,因此解析錯誤,遇到這種情況解決辦法也
是加個小括號,eg: @(ViewBag.MvcNameSpace).Controller,就會輸出“System.Web.Mvc”
輸出Email地址與@跳脫子元
<超鏈接a href="aaabbb@qq.com">aaa</超鏈接a>,也許有人會說@在razor里是個關鍵字,這里應該放兩個@符號,其實不用,razor會自動判斷前后文,只要@的前面和后面都有文字的話,預設這次@就會停用razor語法解析
<超鏈接a href="aaabbb@qq.com">aaa</超鏈接a>如果要將aaa的位置替換為變量
@{
ViewBag.BlogID="aaa";
}
<超鏈接a href="@(ViewBag.BlogID)bbb@qq.com">aaa</超鏈接a>,也只要
加個小括號就可以,
輸出未經htmlEncode的字串
預設使用razor語法輸出變量,所有內容預設都會被HTML編碼為HtmlEncode,這是為了保護網頁不致遭受跨網站腳本攻擊,有了這個預設值,能確保新手寫出不安全代碼
eg:
@{
ViewBag.Description="<標簽 style='font-size:12px;'>描述文字</標簽>";
}
@ViewBag.Description
最后輸出的結果中會是htmlencode過的版本:大於號小於號雙引號都變成了&加一些字母的形式,解決辦法就是利用@Html.Raw輔助方法幫助我們輸出內容
@Html.Raw(ViewBag.Description)這樣就會原封不動的輸出我們想要的樣子。