#javascript #jquery #asp.net #json #dictionary
#javascript #jquery #asp.net #json #словарь
Вопрос:
У меня есть словарная переменная в C # (ASP.NET ). Я хочу отправить эти данные в Javascript. Я использую этот код для его сериализации и отправки в javascript.
Dictionary<string, string> chat;
chat = new Dictionary<string, string>();
chat.Add("Sam", "How are you?");
chat.Add("Rita", "I am good");
var serialize = new System.Web.Script.Serialization.JavaScriptSerializer();
Response.Write(serialize.Serialize(chat));
На странице Javascript я вызываю эту страницу, используя это;
$.ajax({
url: "TextChatCalls/getChat.aspx",
type: "POST",
context: document.body,
success: function (response) {
var Chats = response.split('n')[0];
alert(Chats);
}
});
Значение в Chats var равно {"Sam":"How are you?","Rita":"I am good"}
Я не знаю, как мне прочитать это значение в чатах. Могу ли я каким-либо образом преобразовать это в 2D-массив и прочитать его как array [0] [0], array [1] [0] и т. Д.?
Спасибо.
РЕДАКТИРОВАТЬ: еще одна путаница заключается в том, что объект ответа, возвращенный из ASP.NET , содержит
{"Sam":"How are you?","Rita":"I am good"}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>
</title></head>
<body>
<form name="form1" method="post" action="getChat.aspx?Id=141755" id="form1">
<div>
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwULLTE2MTY2ODcyMjlkZJctiKZK4rXVndR3mbGssIarCrOF" />
</div>
<div>
</div>
</form>
</body>
</html>
И не так {"Sam":"How are you?","Rita":"I am good"}
, как ожидалось. И, следовательно, я должен разделить объект ответа, с помощью var Chats = response.split('n')[0];
которого он становится строкой!
Ответ №1:
Вы читаете так:
alert(Chats["Sam"]);
(так похоже на словарь C # :-). Вы читаете / записываете в него, используя что-то вроде Chats["propertyName"]
)
или, чтобы просмотреть каждое значение:
for (var c in Chats)
{
if (Chats.hasOwnProperty(c))
{
alert(c ' ' Chats[c]);
}
}
Обратите внимание, что это отличается от C #. В C # c
будет содержать a KeyValuePair<>
, содержащий как ключ, так и значение. В Javascript c
есть только ключ, и для получения значения вы должны использовать Chats[c]
.
(обоснование hasOwnProperty
здесь http://yuiblog.com/blog/2006/09/26/for-in-intrigue /)
Итак… Если вы действительно хотите разделить его:
var array = [];
for (var c in Chats)
{
if (Chats.hasOwnProperty(c))
{
array.push([c, Chats[c]]);
}
}
Комментарии:
1. Я не могу понять, почему, но мой объект ответа содержит значение «{«Сэм»:»как ты?»,»Рита»:»я хороший»} <!DOCTYPE html PUBLIC «-//W3C//DTD XHTML 1.0 Transitional//EN» » w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd «> <html xmlns=» w3.org/1999/xhtml «> <head><title> </title></head> <body> <form name=»form1″ method=»post» action=»getChat.aspx?Id=141755″ id=»form1″> <div> <input type=»hidden» name=»__VIEWSTATE» id=»__VIEWSTATE» value=»/wEPDwULLTE2MTY2ODcyMjlkZJctiKZK4rXVndR3mbGssIarCrOF» /> </div> <div> </div> </form> </body> </html> »
2. @Joy Вы должны сделать a
Response.End()
послеResponse.Write()
, иначе вы отправите всю страницу aspx после JSON 🙂3. Еще лучше, если вы должны использовать обработчик ashx или метод страницы. Нет смысла проходить через жизненный цикл aspx, если вы не собираетесь выводить содержимое страницы.
Ответ №2:
Просто добавьте тип данных json в свой ajax-запрос
$.ajax({
url: "TextChatCalls/getChat.aspx",
type: "POST",
dataType: "json"
context: document.body,
success: function (response) {
// do something with response
});
Это создаст response
объект javascript, к которому вы можете получить доступ следующим образом
alert(response["sam"]) //How are you?
чтобы разделить это на 2d-массив, просто сделайте это
var Chats = [];
for ( k in response ){
Chats[Chats.length] = [k, response[k]];
}
Ответ №3:
Я думаю, важным моментом здесь является то, что вы правильно понимаете, что происходит на стороне клиента JavaScript. Тип данных, который поступает на стороне клиента JavaScript, представляет собой строку JSON. JSON (= объектная нотация JavaScript) может напрямую интерпретироваться JavaScript.
Объект JavaScript выглядит следующим образом:
var anObject = { name: "Sam", surname: "abc"};
Вы можете получить доступ к свойствам объекта JavaScript либо с помощью несколько похожего на словарь способа, например
anObject["name"] //will get "Sam"
или напрямую (обозначение свойств)
anObject.name
Вместо этого аналогичная строка JSON будет выглядеть так
var aJsonString = '{ "name": "Sam", "surname": "abc"}'
Теперь, чтобы преобразовать строку JSON в объект JavaScript, вам нужно ее проанализировать. jQuery уже делает это за вас, в противном случае вы можете вызвать JSON.parse(aJsonString)
и получить действительный объект JavaScript.
Здесь я привел краткий пример: http://jsbin.com/adejev/2/edit
Ответ №4:
Для ASP.NET Ядро, я использовал это внутри cshtml
файла. По сути, я перестроил весь словарь в Javascript. Причина такого подхода заключается в том, что у меня есть подфункции в Javascript, которые не смогут вызывать функции модели сервера с динамическими параметрами для таких событий, как нажатие клавиши.
var ModelZxcvWarnLookup = {};
@foreach (var kvp in Model.View.ZxcvbnWarningMsgLocalization)
{
@:ModelZxcvWarnLookup['@Html.Raw(@kvp.Key)'] = '@Html.Raw(@kvp.Value)';
}
Проверка HTML-страницы, извлеченной браузером:
var ModelZxcvWarnLookup = {};
ModelZxcvWarnLookup["Straight rows of keys are easy to guess"] = "Chinese Straight rows of keys are easy to guess";
ModelZxcvWarnLookup["Short keyboard patterns are easy to guess"] = "Chinese Short keyboard patterns are easy to guess";
ModelZxcvWarnLookup['Repeats like "aaa" are easy to guess'] = 'Repeats like "aaa" are easy to guess';