【问题标题】:Asp.Net MVC 3 JSON Model Binding not workingAsp.Net MVC 3 JSON 模型绑定不起作用
【发布时间】:2012-02-13 20:52:34
【问题描述】:

我正在使用 MVC3,并且我知道 MVC3 支持将 JSON 文字绑定到 Action 参数。但是我做不到;

我有一个类名标签

public class Tag
{
    public int tagId { get; set; }
    public string tagName { get; set; }
}

控制器上的一个名为 Tag 的操作

    [HttpPost]
    public ActionResult Tag(Tag tag)
    {
        // Here will be codes...
        return Json(new { success = 0 });
    }

将 js 对象作为 JSON 发送到我的操作的 Javascript 代码

    var tag ={tagId:5,tagName:"hello"};
    $.ajax({
           url: "/image/tag",
           type: "POST",
           data: $.toJSON(tag),
           success: function (r) {
               if (r.success == 1) {
                   window.location = r.redirect;
               }
           }

发布我在 Firebug Net 选项卡中看到的数据

{"tagId":5,"tagName":"hello"}

Tag Action 中的参数名称 tag 不为 null,但 tagId 的值为 O,tagName 的值为 null。 这里有什么问题?

【问题讨论】:

    标签: json asp.net-mvc-3 model-binding


    【解决方案1】:

    需要将请求的内容类型设置为application/json

    $.ajax({
        url: '/image/tag',
        type: 'POST',
        contentType: 'application/json; charset=utf-8',
        data: $.toJSON(tag),
        success: function (r) {
            if (r.success == 1) {
                window.location.href = r.redirect;
            }
        }
    });
    

    啊,您的 Tag 模型属性不需要以小写字母开头:

    public class Tag
    {
        public int TagId { get; set; }
        public string TagName { get; set; }
    }
    

    备注 1:ASP.NET MVC 3 在后台使用的JavaScriptSerializer 类能够正确处理此问题。

    备注 2:在您的 Tag 操作中,您似乎返回了以下 JSON:{"success":0} 而在您的成功 AJAX 回调中,您似乎使用了一些不存在的 r.redirect 属性。

    备注 3:避免以与视图模型相同的方式命名控制器操作。通常动作名称应该代表动词(如ListSaveDelete、...),而视图模型代表资源(TagModel、...)。

    【讨论】:

    • 标签既是名词又是动词
    • 谢谢达林,我面临这个问题大约 1 小时你救了我。也感谢您提供更多信息
    • Remark 2. Success = 0 在响应中,因此块不会评估
    • 使用$.toJSON前需要链接json-js库(github.com/douglascrockford/JSON-js)
    猜你喜欢
    • 1970-01-01
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多