C# 如何将JSON文件发布到ASP.NET MVC操作?

C# 如何将JSON文件发布到ASP.NET MVC操作?,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,我的iphone客户端将以下json发布到我的mvc服务。 当从html表单发布数据时,它会自动将表单数据转换为UserModel,并将对象传递给我的Create方法,但当我从iphone发送请求体中的JSON字符串时,返回为null 将JSON转换为对象的最干净的解决方案是什么 我不想为不同的客户端创建多个方法,所以我尝试在iphone和mvc客户端上使用相同的方法。 我的请求: { "firstName" : "Some Name", "lastName" : "Some Las

我的iphone客户端将以下json发布到我的mvc服务。 当从html表单发布数据时,它会自动将表单数据转换为UserModel,并将对象传递给我的Create方法,但当我从iphone发送请求体中的JSON字符串时,返回为null

将JSON转换为对象的最干净的解决方案是什么

我不想为不同的客户端创建多个方法,所以我尝试在iphone和mvc客户端上使用相同的方法。

我的请求:

{
   "firstName" : "Some Name",
   "lastName" : "Some Last Name",
   "age" : "age"
}
我的模型和行动结果

public class UserModel
{
   public int Id { get; set; }
   public string FirstName { get; set; }
   public string LastName { get; set; }
   public int Age { get; set; }
}

[HttpPost]
public Create ActionResult(UserModel user)
{
   // user is null
   userStorage.create(user);
   return SuccessResultForModel(user);
}

您需要将HTTP头accept设置为“application/json”,以便MVC知道您正在传递json,并对其进行解释

accept: application/json
请参见此处的更多信息:

更新:使用MVC3和jQuery的工作示例代码

控制器代码

视图代码

@{ViewBag.Title=“Index”}
var-sample={};
sample.postData=函数(){
$.ajax({
键入:“POST”,url:@url.Action(“姿势”),
成功:函数(数据){alert('data:'+data);},
数据:JSON.stringify({“firstName”:“Some Name”,“lastName”:“Some Last Name”,“age”:“30”}),
接受:'application/json'
});
};
$(文档).ready(函数(){
sample.postData();
});
指数
**更新**
在将JS对象传递给AJAX请求中的
data
元素之前,我向JS对象添加了
JSON.stringify
。这只会使有效负载更具可读性,但是控制器将以类似的方式解释
数据的两种格式。

很晚了,但希望它能帮助某些人

从JSON到对象的转换最干净的解决方案是什么?

<script src="https://code.jquery.com/jquery-3.1.0.js"></script>

$.post("http://localhost:52161/Default/PostRawJson/", { json: {
   "firstName" : "Some Name",
   "lastName" : "Some Last Name",
   "age" : "age"
}});


public void PostRawJson(string json)
{
    var person = System.Web.Helpers.Json.Decode(json);
    person.firstname...
}

$.post(”http://localhost:52161/Default/PostRawJson/“,{json:{
“名字”:“某个名字”,
“姓氏”:“某个姓氏”,
“年龄”:“年龄”
}});
公共void PostRawJson(字符串json)
{
var person=System.Web.Helpers.Json.Decode(Json);
人,名字。。。
}

通过这种方式,您可以根据请求在控制器中使用纯JSON对象。

我最近提出了一种更简单的发布JSON的方法,另外还有一个步骤,即从我的应用程序中的模型转换。请注意,您必须为控制器创建模型[JsonObject],以获取值并进行转换

请求:

 var model = new MyModel(); 

 using (var client = new HttpClient())
 {
     var uri = new Uri("XXXXXXXXX"); 
     var json = new JavaScriptSerializer().Serialize(model);
     var stringContent = new StringContent(json, Encoding.UTF8, "application/json");
     var response = await Client.PutAsync(uri,stringContent).Result;
     ...
     ...
  }
[JsonObject]
[Serializable]
public class MyModel
{
    public Decimal Value { get; set; }
    public string Project { get; set; }
    public string FilePath { get; set; }
    public string FileName { get; set; }
}
[HttpPut]     
public async Task<HttpResponseMessage> PutApi([FromBody]MyModel model)
{
    ...
    ... 
}
型号:

 var model = new MyModel(); 

 using (var client = new HttpClient())
 {
     var uri = new Uri("XXXXXXXXX"); 
     var json = new JavaScriptSerializer().Serialize(model);
     var stringContent = new StringContent(json, Encoding.UTF8, "application/json");
     var response = await Client.PutAsync(uri,stringContent).Result;
     ...
     ...
  }
[JsonObject]
[Serializable]
public class MyModel
{
    public Decimal Value { get; set; }
    public string Project { get; set; }
    public string FilePath { get; set; }
    public string FileName { get; set; }
}
[HttpPut]     
public async Task<HttpResponseMessage> PutApi([FromBody]MyModel model)
{
    ...
    ... 
}
服务器端:

 var model = new MyModel(); 

 using (var client = new HttpClient())
 {
     var uri = new Uri("XXXXXXXXX"); 
     var json = new JavaScriptSerializer().Serialize(model);
     var stringContent = new StringContent(json, Encoding.UTF8, "application/json");
     var response = await Client.PutAsync(uri,stringContent).Result;
     ...
     ...
  }
[JsonObject]
[Serializable]
public class MyModel
{
    public Decimal Value { get; set; }
    public string Project { get; set; }
    public string FilePath { get; set; }
    public string FileName { get; set; }
}
[HttpPut]     
public async Task<HttpResponseMessage> PutApi([FromBody]MyModel model)
{
    ...
    ... 
}
[HttpPut]
公共异步任务PutApi([FromBody]MyModel)
{
...
... 
}

基于Glenn Ferries的回答,在我查看实际发送给控制器的内容之前,它似乎是有效的,而不是JSON

因此调整如下:

这是使用MVC4和jQuery1.7实现的

控制器操作方法(所讨论的UserModel对象):

发送请求的jQuery代码:

<script>
    $(function () {
        $.ajax({
            type: "POST",
            url: "@Url.Action("Create")",
            /* jQuery will not send JSON unless you explicitly tell it to */
            data: JSON.stringify({ "firstName": "Some Name", "lastName": "Some Last Name", "age": "30" }),
            /* contentType is important for MVC to be able to unpack the json */
            contentType: 'application/json'
            accept: 'application/json',
        }).done( function(data) {
            /* this callback gets used when successful */
            console.log("response: " + data);
        }).fail(function (jqxhr, status, error) {
            /* for debugging: this callback gets used in case of errors */
            console.log("error :" + error);
        }).always(function () {
            /* for debugging: this callback always gets called at the end either way*/
            console.log("complete");
        });
    });

</script>

$(函数(){
$.ajax({
类型:“POST”,
url:“@url.Action(“创建”)”,
/*除非您明确告诉jQuery,否则jQuery不会发送JSON*/
数据:JSON.stringify({“firstName”:“Some Name”,“lastName”:“Some Last Name”,“age”:“30”}),
/*contentType对于MVC能够解压缩json非常重要*/
contentType:'应用程序/json'
接受:'application/json',
}).完成(功能(数据){
/*此回调在成功时使用*/
控制台日志(“响应:+数据);
}).失败(功能(jqxhr、状态、错误){
/*用于调试:在出现错误时使用此回调*/
日志(“错误:+错误”);
}).always(函数(){
/*用于调试:无论哪种方式,此回调始终在末尾被调用*/
控制台日志(“完成”);
});
});
MVC控制器的动作很简单

最困难的一点是确保您实际上正在向它发送JSON来测试它

jQuery ajax()方法与POST一起使用时,通常会在请求体中使用querystring格式对参数进行编码。MVC可以很高兴地打开它

要使用ajax()实际发送JSON,必须使用JSON.stringify()


为了让MVC正确解释该请求,您需要设置contentType

,以确认是否要从json转换命中控制器的用户对象?您是否注册了JsonValueProviderFactory(MVC需要它才能解码json post数据)?客户端是否指定了正确的ContentType?请参阅以查看其他需要检查的内容(排名靠前的答案有列表)。JSON看起来无效,在“age”后面有一个逗号?此外,年龄的值应该是int?(尽管我认为如果做不到这一点,它将使用默认的int值0)。另外,您的HttpPost方法说
创建Actionresult
,它不应该是
Actionresult Create
?@DaveA不,我还没有注册,我会尝试一下并发回感谢这在我尝试将FormCollection的json从controller发布到其他服务时帮了我大忙。谢谢。这确实有效,我喜欢你可以看到解码发生在哪里,而不是在mvc模型绑定器中神奇地发生。但是accept头只是告诉服务器客户端能够接收到什么。如其他问题中所述,设置内容类型标题就足够了:
contentType:“application/json;charset=utf-8”
,我觉得这个答案不对。给出的代码确实有效,但是如果您查看$.ajax()发送的请求的实际主体,它不发送JSON,而是使用application/x-www-form-urlencoded格式,基本上是querystring格式。如果将jQuery代码更改为实际发送JSON,MVC操作将不再工作,因为没有设置contentType。有关发送JSON并正常工作的版本,请参见我的答案。@c