Чтение словаря C # в Javascript

#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';