如何将多个Json对象传递给ASP.net MVC控制器?

时间:2016-07-01 09:54:27

标签: c# asp.net json ajax post

我真的很感激这里的提示......我现在一直在寻找解决方案4小时......

我有这样的功能:

public virtual JsonResult LoadPreviousProductsJson(SearchResultModel rmodel, SearchCriteriaModel cmodel)

我试图像这样向这个控制器发送数据:

var jsonData = $('#frmSearchResult').serialize();
var stringToPost = JSON.stringify(jsonData);

var jsonData2 = $('#frmSearchProducts').serialize();
var stringToPost2 = JSON.stringify(jsonData2);


$.post('@Url.Action(MVC.Product.LoadPreviousProductsJson())', { rmodel: stringToPost, cmodel: stringToPost2 })
    .done(function(data) {....

这导致对象在控制器中为空...

如果我只发送1个Json对象我就成功了:

$.post('@Url.Action(MVC.Product.LoadPreviousProductsJson())', stringToPost)
.done(function(data) {....

但是当我尝试将它们一起发送时,它总是失败......

我能做的只是一些成功的事情是将2个对象作为字符串发送并用Newtonsoft读取它们,但在这里我不能将字符串转换为相应的对象....

model = Newtonsoft.Json.JsonConvert.DeserializeObject<SearchResultModel>(rmodel);
model2 = Newtonsoft.Json.JsonConvert.DeserializeObject<SearchCriteriaModel>(cmodel);

以上代码失败了......

3 个答案:

答案 0 :(得分:2)

创建一个新模型来存储特定于您的操作的有效负载

public class SearchViewModel {
    public SearchResultModel rmodel { get; set; }
    public SearchCriteriaModel cmodel  { get; set; }
}

更新操作以接受预期的有效负载

public virtual JsonResult LoadPreviousProductsJson(SearchViewModel model) {
    SearchResultModel rmodel = model.rmodel; 
    SearchCriteriaModel cmodel = model.cmodel;

    //... other code
}

在客户端上创建相同的模式并发送一个有效负载。

var jsonData = {};
$('#frmSearchResult').serializeArray()
    .map(function(x){jsonData[x.name] = x.value;});

var jsonData2 = {};
$('#frmSearchProducts').serializeArray()
    .map(function(x){jsonData2[x.name] = x.value;});

var model = { rmodel:jsonData, cmodel:jsonData2 };

var payload = JSON.stringify(model);

$.post('@Url.Action(MVC.Product.LoadPreviousProductsJson())', payload)
    .done(function(data) {....}

答案 1 :(得分:1)

public class SearchViewModel 
{
    public SearchResultModel SearchResultModel{ get; set; }
    public SearchCriteriaModel SearchCriteriaModel{ get; set; }
}

public virtual JsonResult LoadPreviousProductsJson(string model) 
{    
    var modelClass = JsonConvert.DeserializeObject<SearchViewModel>(model);
    var searchResultModel = modelClass.SearchCriteriaModel;
    var searchCriteriaModel = modelClass.SearchResultModel;
    //... other code
}

&#13;
&#13;
var jsonData = $('#frmSearchResult').serialize();

var jsonData2 = $('#frmSearchProducts').serialize();

var model = { SearchResultModel: jsonData, SearchCriteriaModel:jsonData2 };
     var url = "/Area/Controller/Action" + "?model=" + JSON.stringify(model) + "";
            $.ajax({
                url: url,
                dataType: "JSON",
                type: "GET",
                success: function () {
                }
            });
&#13;
&#13;
&#13;

希望这可能会有所帮助

答案 2 :(得分:1)

首先,感谢inkosi和krish给予提示(两者都竖起大拇指)。他的答案并非我所需要的,因为我仍然得到空值。

这是最终对我有用的。

控制器:

        public virtual JsonResult LoadPreviousProductsJson(string rmodel, string cmodel){

            SearchResultModel model = new SearchResultModel();

        SearchCriteriaModel modelSearchCriteria = new SearchCriteriaModel();

        model = Newtonsoft.Json.JsonConvert.DeserializeObject<SearchResultModel>(rmodel);

        modelSearchCriteria = Newtonsoft.Json.JsonConvert.DeserializeObject<SearchCriteriaModel>(cmodel); 
.......
}

使用Javascript:

        $.fn.serializeObject = function () {
        var o = {};
        var a = this.serializeArray();
        $.each(a, function () {
            if (o[this.name]) {
                if (!o[this.name].push) {
                    o[this.name] = [o[this.name]];
                }
                o[this.name].push(this.value || '');
            } else {
                o[this.name] = this.value || '';
            }
        });





            var jsonDataNewResult = $('#frmSearchResult').serializeObject();

        var stringjsonDataNewResult = JSON.stringify(jsonDataNewResult);


        var jsonDataNewCriteria = $('#frmSearchProducts').serializeObject();

        var stringjsonDataNewCriteria = JSON.stringify(jsonDataNewCriteria);

        $.post('@Url.Action(MVC.Product.LoadPreviousProductsJson())',
            { rmodel: stringjsonDataNewResult, cmodel: stringjsonDataNewCriteria })
            .done(function(data) {

这一天:-(,我一定要尝试过一百件事......我甚至不记得我尝试过的所有事情......很高兴来到这里,现在向我的老板解释为什么这件微不足道的事情花了我很长时间......我想念桌面编程!

PS。感谢这2个SO帖子:

Convert form data to JavaScript object with jQuery

Consume jQuery.serializeArray in ASP.NET MVC