ASP.NET MVC控制器接受javascript对象
从chrome developer tools中,我看到我的请求正在将此信息发送到我的控制器:ASP.NET MVC控制器接受javascript对象,javascript,asp.net-mvc,Javascript,Asp.net Mvc,从chrome developer tools中,我看到我的请求正在将此信息发送到我的控制器: models:[{"Id":null,"Start":"2014-06-11T12:17:52.452Z","End":"2014-06-11T12:17:52.452Z","Name":"test","Status":"test"}] public class SomeController : Controller { [HttpPost] public JsonResult So
models:[{"Id":null,"Start":"2014-06-11T12:17:52.452Z","End":"2014-06-11T12:17:52.452Z","Name":"test","Status":"test"}]
public class SomeController : Controller
{
[HttpPost]
public JsonResult SomeAction(IList<MyModel> models)
{
// Should pass now
if (ModelState.IsValid)
{
// Handle it and return back the response
// Given the above, you have something like the following now
// assigned to "models":
// models = new List<MyModel> {
// new MyModel {
// Id = null,
// Start = new DateTime(2014, 11, 6, 12, 17, 52),
// End = new DateTime(2014, 11, 6, 12, 17, 52),
// Name = "test",
// Status = "test"
// }
// };
return Json(new {Models = models }); // just to see it come back
}
return Json(new { Error = true, Message = "Invalid model" });
}
}
[HttpPost]
public dynamic UpdateItem([FromBody]dynamic item)
{
var qp = JObject.Parse(item.ToString());
string oid = qp.SelectToken("oid").ToString();
...
如何在我的MVC控制器中接受它
它看起来像是一个包含一个元素的javascript数组
在服务器端,我有一个接受方法:Foo(条形模型)
,还尝试了Foo(列表模型)
模型值始终为
null
。有什么建议吗,如何将值发送到我的服务器?这是mvc的默认行为,它会自动将json对象转换为您的C#对象。只需确保属性名匹配即可。选中此选项可能会有帮助,因为您需要使用JsonConvert.DeserializeObject()方法
像这样
List<YourModelClass> myObjList =
(List<YourModelClass>)Newtonsoft.Json.JsonConvert.DeserializeObject(models, typeof(List<test>));
List myObjList=
(List)Newtonsoft.Json.JsonConvert.DeserializeObject(models,typeof(List));
然后将名为-myObjList的对象返回到您的视图或其他任何位置
而就单一物体而言—
return JsonConvert.DeserializeObject<YourModelClass>(models);
返回JsonConvert.DeserializeObject(模型);
因此,要使用AJAX传递信息,需要提供两个参数:dataType
和contentType
。(我认为dataType
是可选的,但如果您希望返回JSON,最好提供它)。然而,contentType
,让MVC[TheModelBinder
]知道传入的请求不仅仅是一个字符串,而是一个需要反序列化回对象的对象
话虽如此,以下内容应该适用于您的情况:
// This is your to-be-sent data'
// However you collect it, but for now we're storing it as a plain object.
var jso = { models: [{ "Id": null, "Start": "2014-06-11T12:17:52.452Z", "End": "2014-06-11T12:17:52.452Z", "Name": "test", "Status": "test" }] }
// Here we turn it into JSON
var json = JSON.stringify(jso);
// And now we send it off to the controller/action:
$.ajax({
url: '@Url.Action("SomeAction","SomeController")',
type: 'POST',
data: json, // pass of data serialized
dataType: 'json', // expecting json back
contentType: 'application/json; charset=utf-8', // hey ModelBinder, deserialize this!
})/* handle the Deferred callbacks (.done, .fail, .always) */;
然后,在控制器中:
models:[{"Id":null,"Start":"2014-06-11T12:17:52.452Z","End":"2014-06-11T12:17:52.452Z","Name":"test","Status":"test"}]
public class SomeController : Controller
{
[HttpPost]
public JsonResult SomeAction(IList<MyModel> models)
{
// Should pass now
if (ModelState.IsValid)
{
// Handle it and return back the response
// Given the above, you have something like the following now
// assigned to "models":
// models = new List<MyModel> {
// new MyModel {
// Id = null,
// Start = new DateTime(2014, 11, 6, 12, 17, 52),
// End = new DateTime(2014, 11, 6, 12, 17, 52),
// Name = "test",
// Status = "test"
// }
// };
return Json(new {Models = models }); // just to see it come back
}
return Json(new { Error = true, Message = "Invalid model" });
}
}
[HttpPost]
public dynamic UpdateItem([FromBody]dynamic item)
{
var qp = JObject.Parse(item.ToString());
string oid = qp.SelectToken("oid").ToString();
...
public类SomeController:Controller
{
[HttpPost]
公共JsonResult SomeAction(IList模型)
{
//现在应该过去了
if(ModelState.IsValid)
{
//处理它并返回响应
//鉴于上述情况,您现在有如下内容
//分配给“模型”:
//模型=新列表{
//新MyModel{
//Id=null,
//开始=新的日期时间(2014、11、6、12、17、52),
//结束=新的日期时间(2014、11、6、12、17、52),
//Name=“test”,
//Status=“测试”
// }
// };
返回Json(新的{Models=Models});//看看它会回来
}
返回Json(新的{Error=true,Message=“Invalid model”});
}
}
顺便说一下,可以看到工作示例。这里是一个非常简单的示例,使用POST和Json.Net将其反序列化为JObject 通过Nuget获取Json.Net API控制器:
models:[{"Id":null,"Start":"2014-06-11T12:17:52.452Z","End":"2014-06-11T12:17:52.452Z","Name":"test","Status":"test"}]
public class SomeController : Controller
{
[HttpPost]
public JsonResult SomeAction(IList<MyModel> models)
{
// Should pass now
if (ModelState.IsValid)
{
// Handle it and return back the response
// Given the above, you have something like the following now
// assigned to "models":
// models = new List<MyModel> {
// new MyModel {
// Id = null,
// Start = new DateTime(2014, 11, 6, 12, 17, 52),
// End = new DateTime(2014, 11, 6, 12, 17, 52),
// Name = "test",
// Status = "test"
// }
// };
return Json(new {Models = models }); // just to see it come back
}
return Json(new { Error = true, Message = "Invalid model" });
}
}
[HttpPost]
public dynamic UpdateItem([FromBody]dynamic item)
{
var qp = JObject.Parse(item.ToString());
string oid = qp.SelectToken("oid").ToString();
...
例如,确保您的路由和参数名称与实际路由匹配
config.Routes.MapHttpRoute(
name: "ItemApi",
routeTemplate: "api/{controller}/{action}/{item}",
defaults: new { item = RouteParameter.Optional }
);
通常在App_Start/WebApiConfig.cs或global.asax中找到
然后使用jquery ajax发布:
var param = new Object();
param.oid = "somestring";
param.name = "john";
param.number = 3;
$.ajax({
type: "POST",
url: "/api/YourController/UpdateItem",
data: JSON.stringify(param),
contentType: 'application/json',
success: function (data) {
// do stuff
},
error: function (e) {
console.error("error", e);
}
});
编辑:我现在看到您正在使用mvc控制器。我假设我的答案是webapi控制器。抱歉:)如果您将发送此字符串的代码发布到控制器,那会更好。这是如何传递的(AJAX?)您可能需要指定
dataType
参数,以便MVC知道它是JSON传入的,而不仅仅是字符串值。@BradChristie我有数据类型:“JSON”
及其奇怪,当我将控制器更改为接受Foo(对象模型)
时,对象是一个包含字符串的列表,“[{“Id\”:null,\“StartDate\”:“2014-06-11T13:08:19.483Z\”,“EndDate\”:“2014-06-11T13:08:19.483Z\”,“Name\”:“test\”,“Status\:“test\”,“test\”,
,似乎模型绑定被破坏了,因为当我放置真实模型时,我得到空值。@Jaanus:给我几分钟,为你们准备一个工作示例。(我假设这是AJAX,对吗?)这是AJAX,对。顺便说一句,如果它提供更多信息,使用剑道网格内联项目创建,这是chrome开发工具的请求。也许头有问题,Modelbinder
的默认行为就是这样做的。无需显式调用(除非它在ModelBinder
的范围之外变化很大,在这种情况下,您可以实现自己的IModelBinder
),再次说明ModelBinder
完全能够反序列化传入的JSON数据(无需自己在操作或(此外)中处理它)添加另一个依赖项以执行此操作)。IMHO,在ModelBinder
之外提出反序列化信息的替代方案会增加不必要的复杂性和维护麻烦,而且工作量比需要的还要多。这是一个品味问题,不是吗?在这个解决方案中,您不必创建poco,因为poco有时非常方便和合适。如果您决定重命名属性或更改数据类型,该怎么办?不会有编译器错误的奢侈。相反,你会追根究底,或者更糟,在生产中遇到错误。请参阅我的编辑,如果这是一个强类型视图发布到mvc控制器,我可能会使用强类型模型。至于web api,这取决于我的品味和场景。我可以将动态对象的属性名放在json模式或配置中。。。您建议/使用poco的方法也可以;-)理解。我只是觉得固化模型是最好的途径。当然,它们可能会带来额外的开销(特别是当你处理这些小信息时),但是,如果我们不使用它们,我们将使用“VC”而不是“MVC”。-)(顺便说一句,你会惊讶于使用动态
,问题会以多么快的速度显现出来。考虑到JavaScript的“松散性”,这可能是TypeScript背后的最大原因之一)。