后端向前端頁面發送變量的方法,可以包含特殊字符(如英文雙引號)


處理此問題,方法有2種,下面的第二種是最先發現的,后來發現第一種更簡單,都做一下記錄,以備不時之需。

第一種:

對於沒有特殊字符的后台string變量,輸入前台時,直接在后台定義一個protected或public變量,賦值完成后,在前台直接用var value='<%= xxx %>';獲取即可。xxx是后台變量名稱。

對於有特殊字符的后台string變量,比如一段html代碼,可能包含樣式的英文雙引號等特殊字符,如果用上面方法前台就會出錯了。

這種情況下可以把包含特殊字符的變量序列化一下,使變量成為一個json對象,然后拋給前台,

前台用var value=<%= string.IsNullOrWhiteSpace(xxx) ? "0" : xxx%>;來接收,注意此處沒有使用引號包含后台變量。如果后台變量xxx是null或空字符串,需要設置為0,否則前台會出現var value=的錯誤。

如果xxx正常有值,前台value就是一個正常的json對象,在js端就可以正常按照json來使用后台傳入的變量了,最好在使用前判斷下value是否為空。

實例:

后台:

public string SysNotificationRecordsJson = string.Empty;

//變量賦值,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>");是等效的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM