處理此問題,方法有2種,下面的第二種是最早發現的,後來發現第一種更簡單,都作一下記錄,以備不時之需。javascript
第一種:html
對於沒有特殊字符的後臺string變量,輸入前臺時,直接在後臺定義一個protected或public變量,賦值完成後,在前臺直接用var value='<%= xxx %>';獲取便可。xxx是後臺變量名稱。前端
對於有特殊字符的後臺string變量,好比一段html代碼,可能包含樣式的英文雙引號等特殊字符,若是用上面方法前臺就會出錯了。java
這種狀況下能夠把包含特殊字符的變量序列化一下,使變量成爲一個json對象,而後拋給前臺,json
前臺用var value=<%= string.IsNullOrWhiteSpace(xxx) ? "0" : xxx%>;來接收,注意此處沒有使用引號包含後臺變量。若是後臺變量xxx是null或空字符串,須要設置爲0,不然前臺會出現var value=的錯誤。後端
若是xxx正常有值,前臺value就是一個正常的json對象,在js端就能夠正常按照json來使用後臺傳入的變量了,最好在使用前判斷下value是否爲空。this
實例:htm
後臺:對象
public string SysNotificationRecordsJson = string.Empty;ip
//變量賦值,PopusMessageContent 是一段html代碼,可能包含特殊字符,如英文雙引號等,這時就須要特殊處理下。
var recordList = recordRes.GetList(companyId, employeeID);
if(recordList != null && recordList.Any())
{
SysNotificationRecordsJson = Newtonsoft.Json.JsonConvert.SerializeObject(recordList.Select(p=>new { ID = p.RecordID, Content = p.PopusMessageContent }));
}
前臺接收值:
//list
var contentJson = <%= string.IsNullOrWhiteSpace(SysNotificationRecordsJson) ? "0" : SysNotificationRecordsJson %>;
if (contentJson) {
showSysNotification(0, contentJson);
}
若是後臺的變量不是list,而只是一個string值,但包含特殊字符,最好也把它作成json對象拋到前端,如:
後臺:
string xxx=string.empty;
//變量賦值,可能包含特殊字符,序列號爲一個json對象拋給前臺去接收
xxx = Newtonsoft.Json.JsonConvert.SerializeObject(new {msg = model.xxx});
前臺接收變量:
var json = <%= string.IsNullOrWhiteSpace(xxx) ? "0" : xxx %>;
if (json) {
alert(json.msg)
}
這樣就解決了後臺傳入特殊字符的變量給前臺使用的問題,堪稱完美!
其實主要解決方法仍是利用了序列號成json時會把特殊符號進行轉義的原理,牢記此方法。
第二種:
後端向前端頁面發送變量,若是變量沒有特殊字符,如英文的雙引號等能夠直接在前端使用
var value="<%=this.IsHuaMedicineAlertMsg.ToString().ToLower() %>"這種方式輸送給前端,
但若是變量有特殊字符,如英文的雙引號(通常是一段html片斷,可能會包含樣式等會有英文雙引號),就不能用上面的方法了,
或者把後臺變量序列號一下再給前臺顯示,有時可能也能解決問題,但不保險。
這時就須要後臺把這個字符進行序列號再拋給前端來使用,這樣也不用在前端再寫接收後端變量的代碼,
這樣可行的原理是由於序列號時會把特殊字符進行特殊處理,這樣前臺就能夠正常接收了。
具體以下:
後端:
/用各家公司的提示內容的KeyName查找資源文件下單內容,而後轉成json拋給前臺,由於提示內容是html片斷,可能涉及到雙引號等,因此須要轉成json
var KeyName = EAPConsts.GetCompanyParameter(companyID, 385);
var AlertMsg = TCG.ESOP.Resources.MessageResource.ResourceManager.GetString(PlaceOrderAlertMsgKeyName);
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "xxxx", $"window.AlertContent={Newtonsoft.Json.JsonConvert.SerializeObject(AlertMsg)};", true);
前端直接使用window.AlertContent就行了,如:
var msg = window.AlertContent;
備註:Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "xxxx", $"window.AlertContent={Newtonsoft.Json.JsonConvert.SerializeObject(AlertMsg)};", true);
和Response.Write($"<script type='text/javascript'>window.AlertContent={Newtonsoft.Json.JsonConvert.SerializeObject(AlertMsg)};</script>");是等效的。