伙计们,我在MVC4和MVC5上尝试了这个。
我需要将一个具有一些属性和集合的对象从客户端传递给控制器。
我已将C#中的模型定义为:
public enum RequestMode { ReadOnly = 0, Edit = 1}
public class DataRequest
{
public int ProjectId { get; set; }
public RequestMode Mode { get; set; }
public List<PageRequest> PageRequests { get; set; }
public DataRequest()
{
PageRequests = new List<PageRequest>();
}
}
public class PageRequest
{
public int Id { get; set; }
public int PageCurrent { get; set; }
public int RowCountPerPage { get; set; }
}
MVC控制器定义为(仅使用它设置断点来检查请求值):
[HttpPost]
public JsonResult Test(DataRequest request)
{
return new JsonResult();
}
Index.cshtml客户端包含ajax调用:
<script type="text/javascript">
var RequestMode = { ReadOnly: 0, Edit: 1 };
var dataRequest = { ProjectId: 17, Mode: RequestMode.Edit, PageRequests: new Array() };
var pageRequest = { TableId: 3165, PageCurrent: 4, RowCountPerPage: 30 };
dataRequest.PageRequests.push(pageRequest);
$(document).ready(function () {
$.ajax({
data: dataRequest,
type: 'POST',
cache: false,
url: '/Home/Test',
success: function (data) {
},
fail: function (data) {
}
});
});
</script>
我开始调试,页面加载,控制器Test方法中的断点被点击。
在调试器中,请求对象显示为: 模式:编辑 PageRequests:Count = 1 ProjectId:17
当我展开PageRequests集合属性时,我看到: {} Mvc5WebTest.Controllers.PageRequest Id:0 PageCurrent:0 RowsPerPage:0
我希望PageIquest对象能够填充我设置的值(即3165,4,30)
使用Fiddler,我看到完整的DataRequest对象正在变为正确的Json,但似乎MVC控制器无法将其转回C#对象。
作为一种解决方法,我可以修改客户端上的ajax调用 var cdr = JSON.stringify(dataRequest);
$.ajax({
dataType: 'json',
type: 'GET',
data: { jsonRequest: cdr },
...
然后在控制器中
[HttpGet]
public ActionResult Test(string jsonRequest)
{
var request = JsonConvert.DeserializeObject<DataRequest>(jsonRequest);
return new JsonResult();
}
这样可行,但我不希望将数据作为字符串传递。
任何人都可以了解发生了什么以及我需要做些什么来填充这个集合?
答案 0 :(得分:8)
由于您要发布JSON数据,因此必须使用JSON.stringify
将对象转换为字符串并声明contentType: "application/json; charset=utf-8"
$(document).ready(function () {
$.ajax({
data: JSON.stringify(dataRequest),
type: 'POST',
contentType: "application/json; charset=utf-8",
url: '/Home/Test',
success: function (data) {
},
fail: function (data) {
}
});
我还注意到在C#代码中,您将PageRequest
定义为
public class PageRequest
{
public int Id { get; set; }
public int PageCurrent { get; set; }
public int RowCountPerPage { get; set; }
}
在js中,
var pageRequest = { TableId: 3165, PageCurrent: 4, RowCountPerPage: 30 };
C#中的Id
与js中的TableId
之间存在冲突。你必须使用其中一个。
答案 1 :(得分:-1)
您必须指定您正在发送JSON,因为默认内容类型是字符串:
$(document).ready(function () {
$.ajax({
data: dataRequest,
type: 'POST',
cache: false,
contentType: "application/json; charset=utf-8",
url: '/Home/Test',
success: function (data) {
},
fail: function (data) {
}
});