将JSon发送到ASP.net webmethod并反序列化为一个对象

时间:2014-09-17 19:31:23

标签: c# jquery asp.net ajax json

我有一个.aspx页面,我们正在运行时动态加载UserControls。每个用户控件都有某种文本框或组合或其他控件。一切正常。当我们在用户按下搜索时从控件中读取值时,我们不能直接从C#代码后面执行此操作,因为页面不知道它们在那里。我的解决方案是使用JQuery读取值并进行ajax调用,我可以在会话变量中设置值,以便在用户进入下一页时使用。我特别遇到了JSon的问题。 我一直收到错误:

{"Message":"Cannot convert object of type \u0027System.String\u0027 to type \u0027System.Collections.Generic.IDictionary`2[System.String,System.Object]\u0027","StackTrace":" 

我使用.each找到所有控件并获取JSon调用的值:

        function SaveFields() {
        var data = [];

        //get Search field criteria
        $('[id^=Search_ucField_]').each(function (index, value) {
            var field = $(this);
            var id = $(this).attr('id').split("_")[2];
            var fieldValue = $(this).val();

            if (field.is('input')) {
                var item = {};
                item['FieldID'] = id;
                item['Criteria'] = fieldValue;
                item['IsActive'] = 1;
                item['FieldCategoryID'] = '1';
                item['ControlPath'] = '~/Controls/Search/TextBox.aspx';
                item['CategoryID'] = 1;         
                data.push(item);
            }
        });

        $.ajax({
            url: '/Ajax/Ajax.aspx/DoSearch',
            type: 'POST',
            data: JSON.stringify(data),
            datatype: 'json',
            contentType: 'application/json',
            success: function (msg) {
                console.log(msg);
            },
            error: function (xhr, textStatus, errorThrown) {
                alert('Error!  Status = ' + xhr.status);
            }
        });
}

这是我试图反序列化的对象:

[DataContract]
public class SearchFields
{
    [DataMember]
    public List<SearchField> Field { get; set; }
}

[DataContract]
public class SearchField
{
    [DataMember]
    public string FieldID { get; set; }
    [DataMember]
    public bool IsActive { get; set; }
    [DataMember]
    public string Criteria { get; set; }
    [DataMember]
    public int FieldCategoryID { get; set; }
    [DataMember]
    public string ControlPath { get; set; }
}

这是WebMethod

        [WebMethod]
    public static string DoSearch(string Fields) 
    {

        var sf = new SearchFields();

        sf = JsonConvert.DeserializeObject<SearchFields>(Fields);

        //save into session variable
        SVars.NewUISearch.LastSearchFields = sf;

        string x;
        x = "until this works, this is a static response";
        return x;

    }

最后,这是一个正在发送的JSon示例:

[{"FieldID":"52","getCriteria":"Bobs your uncle","IsActive":1,"FieldCategoryID":"1","ControlPath":"~/Controls/Search/TextBox.aspx"}]

我在哪里错了?提前谢谢!

1 个答案:

答案 0 :(得分:0)

我无法让$('form').serialize()工作,所以这就是我所做的。确保您在模型中定义的属性代表您的模型中的属性,并且是强类型的。

 var model = {        
        MyString: $("#MyString").val(), 
        MyNumber: $("#MyNumber").val(),
        IsCheck: $("CHK").val()
    };     

    $.ajax({
        type: "POST",
        url: "/Testing/Index",
        contentType: "application/json",
        data: JSON.stringify(model),
        dataType: "json",
        success: function (data) {
            // Good stuff
        },
        error: function (data) {
            // Bad stuff
        }
    })