如何将JSON文件发布到ASP.NET MVC Action?

时间:2013-03-10 01:20:00

标签: c# asp.net asp.net-mvc

我的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);
}

5 个答案:

答案 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