Asp.Net mvc,张贴json?

ary*_*axt 12 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"
}
Run Code Online (Sandbox Code Playgroud)

我的模型和行动结果

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);
}
Run Code Online (Sandbox Code Playgroud)

Gle*_*rie 20

您需要将HTTP Header(接受)设置为'application/json',以便MVC知道您传递JSON并完成解释它的工作.

accept: application/json
Run Code Online (Sandbox Code Playgroud)

在这里查看更多信息:http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

更新:使用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; }
    }
}
Run Code Online (Sandbox Code Playgroud)

查看代码

@{ 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>
Run Code Online (Sandbox Code Playgroud)

  • 但是接受标头只是告诉服务器客户端能够接收什么.如其他问题所述,设置内容类型标题就足够了:`contentType:"application/json; charset = utf-8"`, (3认同)
  • 感谢您的所有努力 (2认同)

Jes*_*Jin 7

尝试将方法更改为此以查看是否获得FirstName或LastName

public Create ActionResult(string FirstName, string LastName)
Run Code Online (Sandbox Code Playgroud)

  • 我不认为海报有权发表评论 (4认同)
  • @Snixtor,这是我从未同意过的事情.限制新用户评论然后向他们投票的陷阱.这是一个+1,希望很快他会达到15并做出明智的评论.杰西,我希望你不要失去你的动力,但在发表评论之前再做一些研究. (4认同)
  • 谢谢你们所有的评论:)我会尽力做得更好 (4认同)
  • 如果你想赞成荒谬的答案只是为了对新人好,请尽量不要在一个与明智的答案联系起来的问题上做.因为你不同意SO政策而提出的建议只是愚蠢,并没有帮助海报改善.带有关于什么是好问题和答案的信息链接的评论更有可能真正帮助改善这个人.善意,错误的方法论. (3认同)
  • 建议应该是评论,而不是答案。 (2认同)