我真的很感激这里的提示......我现在一直在寻找解决方案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);
以上代码失败了......
答案 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
}
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;
希望这可能会有所帮助
答案 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帖子: