我的iphone客户端将以下json发布到我的mvc服务。 从html表单发布数据时,它会自动将表单数据转换为UserModel并将对象传递给我的Create方法,但是当我从iphone发送请求正文中的JSON字符串时,它返回null。
从JSON到Object的转换最干净的解决方案。
我宁愿不为不同的客户创建多种方法,所以我试图让同样的方法在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);
}
答案 0 :(得分:20)
您需要将HTTP Header(接受)设置为'application / json',以便MVC知道您传递JSON并完成解释它的工作。
accept: application/json
在此处查看更多信息:http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
UPDATE:使用MVC3和jQuery
运行示例代码控制器代码
namespace MvcApplication1.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
[HttpPost]
public JsonResult PostUser(UserModel data)
{
// test here!
Debug.Assert(data != null);
return Json(data);
}
}
public class UserModel
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public int Age { get; set; }
}
}
查看代码
@{ ViewBag.Title = "Index"; }
<script src="../../Scripts/jquery-1.9.1.min.js"></script>
<script type="text/javascript">
var sample = {};
sample.postData = function () {
$.ajax({
type: "POST", url: "@Url.Action("PostUser")",
success: function (data) { alert('data: ' + data); },
data: { "firstName": "Some Name", "lastName": "Some Last Name", "age": "30" },
accept: 'application/json'
});
};
$(document).ready(function () {
sample.postData();
});
</script>
<h2>Index</h2>
答案 1 :(得分:7)
尝试将方法更改为此方法,以查看是否获得FirstName或LastName
public Create ActionResult(string FirstName, string LastName)
答案 2 :(得分:1)
迟到但希望它有所帮助。
从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...
}
通过这种方式,您可以按照要求在控制器中使用纯JSON对象。
答案 3 :(得分:1)
我最近提出了一种更简单的发布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)
{
...
...
}
答案 4 :(得分:1)
基于Glenn Ferries的答案,在我查看实际发送到控制器的内容之前,它似乎一直有效-它不是JSON。
因此调整如下:
这与MVC 4和jQuery 1.7一起使用
控制器操作方法(有问题的UserModel对象):
[HttpPost]
public ActionResult Create(UserModel user)
{
Debug.Assert(data != null);
return Json(data);
}
用于发送请求的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>
MVC控制器的动作很简单。
困难的是要确保您实际上正在向其发送JSON以对其进行测试。
jQuery ajax()方法与POST一起使用时,通常会在请求正文中使用querystring格式对参数进行编码。 MVC可以很高兴地打开它。
要实际使用ajax()发送JSON,必须使用JSON.stringify()。
为使MVC正确解释该请求,您需要设置contentType