Asp.net MVC 3 JSON模型绑定器

时间:2012-08-06 18:28:11

标签: jquery asp.net-mvc-3 modelbinders

所以我有这个JSON

mrn:"0760433"
res:[{"registry":1,"episodeType":{"id":6,"dateAndTime":"08-06-2012 13:21"}}]

我有这些视图模型

    public class patient
    {
        public string mrn { get; set; }

    }

    public class episodeType
    {
        public int id { get; set; }
        public string dateAndTime { get; set; }
    }

    public class registryEpisode 
    {
        public int registry { get; set; }
        public episodeType episodeType { get; set; }

       public registryEpisode()
       {
           registry = 0;
           episodeType = new episodeType();
       }
    }

这个控制器签名:

public JsonResult StartSession(string mrn, List<registryEpisode> res)

当我发帖时,res总是为空。有什么想法吗?我究竟做错了什么?是的,我发帖,是的,我正在使用jquery:

$.post('Action', data, function () {});

是的,我确实在我的控制器上执行了操作,但res为空。救命!一如既往地感谢...!

1 个答案:

答案 0 :(得分:1)

所以这是一个有趣的解决方案......我正在使用淘汰赛。 Knockout中有一些功能,允许您将viewModel作为pojo(普通旧JSON对象)或pojso(普通旧javascript对象)提供给您。

所以这是最重要的时刻...... asp.net模型绑定器期望用于转换的字符串化JSON字符串。 Knockout的toJSON已经对viewModels进行了字符串化,所以当你有一个像字符串这样的主要类型和一个集合作为你的动作的参数时,你必须获得原始类型的值,如

var m = self.model.property();

然后将该集合作为pojso,如

var c = ko.toJS(self.model.collection)

然后将它们串作为一个完整的视图模型,如

var data = JSON.stringify({prop1: m, prop2: c});

最后,使用jquery ajax调用向模型服务器端发送一个Action方法,如

public JsonResult StartSession(string prop1, IList<registryEpisode> prop2){}

显然这就是诀窍。对我而言似乎是一种黑客,但它确实有效。希望这有助于其他人。