从ASP.NET WebService返回的JSON不足

时间:2010-01-07 17:40:56

标签: asp.net javascript json serialization yui

我已经构建了几个成功将我的.NET类型序列化为JSON的Web服务。但是,我遇到了一个问题,即让JSON与YUI库和DataTable完全兼容。

可以使用JSON对象完全配置YUI DataTable。我在.NET中创建了以下结构来表示给定的YUI列定义:

 public struct YuiColumnDefinition{
        public string key;
        public string label;
        public bool sortable;
        public string formatter;
 }

'formatter'属性是指示YUI表在显示给定列时使用自定义javascript函数的方式。问题是,由于格式化程序被定义为String,因此ASP.NET在序列化时将其值包含在双引号中,并且YUI不再将该值识别为JavaScript令牌:

JSON YUI期待

[ 
{key:"1", label:"Order Date", formatter:myCustomJavaScriptFunction, sortable:true},
{key:"2", label:"Customer Name", formatter:null, sortable:false}
]

JSON ASP.NET创建

[ 
{key:"1", label:"Order Date", formatter:"myCustomJavaScriptFunction", sortable:true},
{key:"2", label:"Customer Name", formatter:null, sortable:false}
]

任何人都有修改YUI源代码的解决方案吗?

由于

2 个答案:

答案 0 :(得分:3)

更改您的解析代码。

将json视为xml的替代品,你不会在xml中放入变量/函数。在其中之一中,您可以轻松识别要使用的格式化程序的名称或类型(例如,从列表或枚举中)。然后你的解析代码会知道它应该将变量/方法指定为“formatter”属性。

在回调中返回实际变量/函数是错误的。你可以使它工作但老实说它不是要走的路。

我会做以下事情......

将您的返回json更改为此。

[ 
{key:"1", label:"Order Date", formatterName:"myCustomJavaScriptFunction", sortable:true},
{key:"2", label:"Customer Name", formatterName:null, sortable:false}
]

然后在JS中,我们假设json存储在变量returnedObj

function augmentReturnedObject(returnedObj)
{
    // validate that returnObj.formatterName (as a variable) is not undefined
    var isValidObj = (window[returnedObj.formatterName] !== undefined);

    if (isValidObj)
    {

        // this will return the actual function / variable, here we are assigning it to returnedObj.formatter
        returnedObj.formatter = window[returnedObj.formatterName];
    }
    else
    {
        returnedObj.formatter = null;
    }
}

你可以毫不费力地将其降低到这个水平

function augmentReturnedObject(returnedObj)
{
    var specifiedMethod = window[returnedObj.formatterName];

    returnedObj.formatter = (specifiedMethod === undefined) ? null : window[returnedObj.formatterName];
}

所以最后你要拿走你的json对象,并做augmentReturnedObject(returnedObj);,此时你可以将returnedObj传递给YUI

答案 1 :(得分:0)

正如艾伦正确指出的那样:

  

在回调中返回实际变量/函数是错误的。

仍然,我在YUI文档中找不到任何地方说明如何处理从JSON或XML返回的javascript函数。

谢天谢地。正如在this中指出的那样,注册自定义javascript格式化函数的“正确”方法是使用YAHOO.widget.DataTable.Formatter:

从.ASMX

返回的JSON列定义
[              
 {key:"1", label:"Order Date", formatter:"myCustomJavaScriptFunction1", sortable:true},             
 {key:"2", label:"Customer Name", formatter:null, sortable:false}             
 {key:"3", label:"State", formatter:"myCustomJavaScriptFunction2", sortable:false}             
]

Javscript连接YUI DataTable

YAHOO.widget.DataTable.Formatter.myCustomJavaScriptFunction1= this.myCustomJavaScriptFunction1;
YAHOO.widget.DataTable.Formatter.myCustomJavaScriptFunction2= this.myCustomJavaScriptFunction2;

function  myCustomJavaScriptFunction1(elCell, oRecord, oColumn, oData) {
   //do something
}

function  myCustomJavaScriptFunction2(elCell, oRecord, oColumn, oData){
   //do something
}