【问题标题】:MVC4 Model Binding - Null ValuesMVC4 模型绑定 - 空值
【发布时间】:2012-08-10 07:21:13
【问题描述】:

我知道已经有很多问题了——我很难找出哪些与版本问题有关,哪些与 jQuery(我没有使用)有关,等等. 我有 MVC4 RC (4.0.20505.0),Visual Studio 2010 Ultimate SP1。

我的模型中有一个复杂类型:

public HttpResponseMessage Post([FromUri]Person person)
    {
        TableStorageHelper personHelper = new TableStorageHelper();
        personHelper.Save(personHelper.GetTableNameForType("Person"), person);

        var response = Request.CreateResponse<Person>(HttpStatusCode.Created, person);
        return response;
    }

我传入这个 JSON 字符串 - 主要使用 Fiddler,但也尝试从另一个控制器中的代码(尝试在本地进行所有测试只是为了验证我可以获取控制器接收到的对象中的值):

JSON:

{"FirstName":"Andy","LastName":"Schultz","PartitionKey":"USW","RowKey":"per-928c8f74-2efd-4fc2-a71c-fb3ea8acc6d7","NickName":null,"FullName":"Andy Schultz","Description":null,"ImageLocation":null,"Region":"USW","CommentsAboutMe":{"Comments":[]},"CommentsByMe":{"Comments":[]}}

这里的所有属性确实存在于类中。

另一个控制器的代码:

HttpWebRequest request = HttpWebRequest.Create("http://127.0.0.2:8080/api/persons/") as HttpWebRequest;
        request.Method = "POST";
        request.ContentType = "text/json";
        using (var writer = new StreamWriter(request.GetRequestStream()))
        {
            Person person = new Person("Andy", "Schultz", "USW");
            Formatting formatting = new Formatting();
            JsonSerializerSettings settings = new JsonSerializerSettings();
            settings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
            string json = JsonConvert.SerializeObject(person, formatting, settings);

            writer.Write(json);
        }

每次,我都会在我的控制器中得到一个空的 Person 对象(我正在那里的第一行进行调试)。每个值都是 NULL。

您可能已经注意到我的控制器上的 [FromUri] 属性 - 我必须这样做才能绕过一个错误,告诉我没有未定义类型的 ModelBinder,但我不确定它是否正确 - 我是如您所知,没有在 Uri 中传递任何信息,它在正文中。

【问题讨论】:

    标签: json asp.net-mvc-4 asp.net-web-api


    【解决方案1】:

    谢谢迈克·斯托尔:http://blogs.msdn.com/b/jmstall/archive/2012/04/16/how-webapi-does-parameter-binding.aspx

    [FromUri] 属性确实告诉我的控制器读取 uri 而不是请求正文为我的控制器方法寻找参数。它不存在,所以一切都是空的。

    添加该属性修复的错误,表示没有为未定义的内容类型定义格式化程序,是由于我不正确地声明请求的内容类型引起的。正确的方法是“Content-Type: text/json; charset=utf-8

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多