0

我正在编写我的第一个 SignalR 代码,但遇到了未捕获的类型错误。我的代码最初可以工作,因为我的集线器控制器将一个序列化数组返回给客户端。当我尝试使用 $.each() 方法遍历数组时会出现问题。我收到的确切错误是:

未捕获的类型错误:无法使用 'in' 运算符在 [{"OptionsId":3,"MembershipLevel":"Gold","MembershipLevelId":2,"Days":0,"Months":1, 中搜索 '95' “费用”:20.00}]

我不知道这意味着什么,所以我不确定这是否与 SignalR、jQuery 或其他相关。这是我的代码。

jQuery:

var getOptions = function () {
// reference the auto generated proxy for the hub
var vR = $.connection.vendorRegistration;

// create the function that the hub can call back to update option
vR.client.updateMembershipOptions = function (returnOptions) {
    // update the selectList
    $("select[name=SelectedMembershipOption]").empty();

    // this is where I receive the error
    $.each(returnOptions, function (index, memOption) {
        $("select[name=SelectedMembershipOption]").append(
            $("<option/>").attr("value", memOption.OptionsId)
              .text(memOption.MembershipLevel)
            );
    });
};

// Start the connection
$.connection.hub.start().done(function () {
    $("#VendorType").change(function () {
        // call the ReturnMembershipOptions method on the hub
        vR.server.returnMembershipOptions($("#VendorType")
            .val());
    });
});
};

服务器端:

public class VendorRegistration : Hub
{
    public void ReturnMembershipOptions(int vendorTypeId)
    {
        // get the options
        var options = AcoadRepo.Vendors.ApiLogic.MembershipOptions
            .ReturnOptions(vendorTypeId);

        // serialize the options
        var returnOptions = JsonConvert.SerializeObject(options);

        // call the updateMembershipOptions method to update the client
        Clients.All.updateMembershipOptions(returnOptions);
    }
}
4

1 回答 1

2

您收到错误的原因是因为您正在尝试遍历字符串。它试图遍历字符串的原因是因为这一行:

// serialize the options
var returnOptions = JsonConvert.SerializeObject(options);

SignalR 将为您序列化您的对象,因此由于您在集线器方法中进行序列化,因此通过线路传输的数据被双重序列化,然后表示一个纯字符串,因此当它到达客户端时,它被反序列化为字符串。

对字符串执行 .each 会抛出异常,因为它要求调用参数是数组或对象。

要解决您的问题,只需删除您的序列化并使用您的选项调用该函数,即:

public class VendorRegistration : Hub
{
    public void ReturnMembershipOptions(int vendorTypeId)
    {
        // get the options
        var options = AcoadRepo.Vendors.ApiLogic.MembershipOptions
            .ReturnOptions(vendorTypeId);

        // call the updateMembershipOptions method to update the client
        Clients.All.updateMembershipOptions(options);
    }
}
于 2013-07-17T18:01:08.263 回答