簡體   English   中英

ASP.NET MVC-在客戶端JS中訪問C#字符串

[英]ASP.NET MVC - Accessing C# string in client-side JS

在我的控制器方法中,我有以下簡單的逗號分隔的字符串,我使用TempData將其傳遞給視圖:

var test = "hi,bye";
TempData["test"] = test;

在我看來,我有以下js方法:

var desks = @(TempData["test"]).split(",");

當我使用Google Chrome開發者控制台檢查DOM時,看到以下內容:

var desks = hi,bye.split(",");

為什么我傳遞的TempData字符串失去引號並變成某種其他對象? 我究竟做錯了什么?

您傳遞的字符串不會“丟失”其引號; 字符串沒有引號,即使字符串字面值也沒有引號。

您必須執行JavaScript字符串轉義,如下所示:

'@(TempData["test"].
    Replace("\\", "\\\\").
    Replace("\n", "\\n").
    Replace("\r", "\\r").
    Replace("'", "\\'"))'.split(",");

這將創建一個轉義的字符串,該字符串可能足夠安全以作為JavaScript字符串文字輸出。

另一個選擇是調用JSON序列化以輸出字符串,該字符串將覆蓋您的所有基礎。

@Html.Raw((new JavaScriptSerializer()).Serialize(TempData["test"])) .split(",");

JavaScriptSerializer.Serialize將采用任何對象(在這種情況下為字符串) ,並以JavaScript可以理解的方式輸出它。

然后, Html.Raw將確保Serialize的輸出不使用HTML-encoding寫入輸出流。

C#代碼的最后一個)和JavaScript .split之間需要有多余的空間。 沒有它,Razor會將split解釋為C#方法的名稱,但事實並非如此。

要使用JavaScriptSerializer類,只需在視圖頂部添加@using System.Web.Script.Serialization指令。

您可以簡單地做到這一點:

'@(TempData["test"])'.split(",");

Javascript不會解釋它是否是C#中的字符串。 它只是將字符串寫入代碼中。 您需要在C#代碼之前和之后手動輸入引號,因此javascript會將hi,bye作為字符串讀取。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM