JSon对象参数成员allways null / empty

时间:2012-04-02 15:20:32

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

如果我理解发布的JSon数据绑定到asp.net mvc 3中的动作参数,我没什么特别的。

例如:

[HttpPost]
public JsonResult Synchro(TestJSON data)
{
  ... data member should contain the JSon data sent...
  return Json("ok" );
}

TestJSON类:

public class TestJSON
{
    public string chaine;
    public int nombre;
}

和JSon数据:

{chaine:"Test",nombre:"23"}

(与curl.exe一起发送以进行测试)

但是Syncho函数中的数据成员总是为null或0。

我搜索了很多,我无法理解。

我发现了一些奇怪的东西。如果我删除了JsonValueProviderFactory(在Application_Start中):

var v = ValueProviderFactories.Factories.OfType<JsonValueProviderFactory>().First();
ValueProviderFactories.Factories.Remove(v);

如果我创建自己的模型绑定器(在赌注的某个地方找到):

 public class JeanJsonModelBinder : IModelBinder
 {
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        if (!controllerContext.HttpContext.Request.ContentType.StartsWith("application/json", StringComparison.OrdinalIgnoreCase))
        {
            // not JSON request
            return null;
        }

        var request = controllerContext.HttpContext.Request;
        var incomingData = new StreamReader(request.InputStream).ReadToEnd();

        if (String.IsNullOrEmpty(incomingData))
        {
            // no JSON data
            return null;
        }

        JavaScriptSerializer serializer = new JavaScriptSerializer();
        return serializer.Deserialize(incomingData, bindingContext.ModelType);
    }
  }

如果我手动绑定我的参数:

[HttpPost]
public JsonResult Synchro([ModelBinder(typeof(JeanJsonModelBinder))] TestJSON data)
{
  ... data member should contains JSon data sent...
  return Json("ok" );
}

有效!

有什么想法吗?

由于

1 个答案:

答案 0 :(得分:2)

尝试使用模型类的属性而不是数据库。 我认为如果你用你的默认模型绑定器替换它可能会起作用,但你仍然应该使用propertys,因为这是标准的mo。