JavaScriptSerializer для сериализации имени функции JavaScript - PullRequest
2 голосов
/ 09 сентября 2010

Я использую Flexigrid в своем проекте, чтобы добавить кнопку на панели инструментов сетки. Я могу использовать код, подобный следующему:

...    
"buttons":[
    {"name":"Modifica","bclass":"edit","onpress":"doCommand"},
    {"name":"Elimina","bclass":"delete","onpress":"doCommand"}
],
...

В любом случае атрибут «onpress» должен содержать ссылку на обратный вызов js и такэто поле не должно быть заключено в кавычки.

Я использую класс JavaScriptSerializer (в пространстве имен System.Web.Script.Serialization) для сериализации.

Как мне объявить переменную, чтобы JavaScriptSerializer сериализовался подобным образом?

...    
"buttons":[
    {"name":"Modifica","bclass":"edit","onpress":doCommand},
    {"name":"Elimina","bclass":"delete","onpress":doCommand}
],
...

Спасибо за помощь!

Ответы [ 4 ]

4 голосов
/ 12 сентября 2012

Как насчет этого трюка?

var param = new Dictionary<string,string>();

param["onpress"] = "%doCommand%";

return new JavaScriptSerializer().Serialize( param ).Replace( "\"%", "" ).Replace( "%\"", "" );
0 голосов
/ 09 сентября 2010

Насколько мне известно, не существует собственного способа сделать это с помощью сериализатора .NET, но вы могли бы выполнить следующий код на стороне клиента, чтобы превратить строку onpress JSON в обратный вызов..

var buttons = []; // Your JSON array
for(var i = 0; i < buttons.length; i++) {
  var b = buttons[i];
  b.onpress = window[b.onpress];
}
0 голосов
/ 09 сентября 2010

Вы можете сохранить имя функции в виде строки

...    
"buttons":[
    {"name":"Modifica","bclass":"edit","onpress":"doCommand"},
    {"name":"Elimina","bclass":"delete","onpress":"doCommand"}
],
...
0 голосов
/ 09 сентября 2010

JavaScriptSerializer предназначен для сериализации в JSON, а JSON не может представлять функции; он также не может ссылаться на ранее определенные переменные. Поэтому я не верю, что это возможно.

...