2012-11-12 158 views
2

我见过很多类似的问题,我尝试了所有可能的答案,但我的问题仍然是相同的。基本上,我有以下ajax电话。参数为空

var obj = { 
    Duration: 12000, 
    Errors: 2 
}; 
var post = $.ajax({ 
    url: APIUrl, 
    data: JSON.stringify(obj), 
    type: "POST", 
    cache: false, 
    dataType: 'json', 
    contentType: 'application/json, charset=utf-8' 
}); 

这是我的视图模型。

public class TargetBasedViewModel 
{ 
    public int Duration{ get; set; } 
    public int Errors{ get; set; } 
} 

这里是我的控制器。

[HttpPost] 
    public HttpResponseMessage Post(TargetBasedViewModel test) 
    { 
     return new HttpResponseMessage(HttpStatusCode.OK); 
    } 

问题是该参数保持为空。 我已经使用Fiddler来检查请求,它看起来很好,所有的属性都在那里,我甚至可以检查JSON对象,并确保我的值实际上被发送到服务器。我已经阅读了很多文章,甚至试图将[ModelBinder]和[FromBody]添加到参数中,但仍然没有运气。 我也试图加入到我的Application_Start()

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings = new JsonSerializerSettings(); 

任何想法我可能是做错了?

+1

我假设你的问题是控制器方法正在被调用,它只是一个空参数?你可以看看控制器认为发布的数据是什么样的。 –

+0

是的,我实际上在控制器的开始处有一个断点,一切都加载正常,除非我一直在参数中获得一个空值。我希望能够“检查”控制器请求中的内容,但序列化程序或模型联编程序应该负责创建我定义的类的实例。换句话说,我不知道如何检查控制器中的其他内容,现在我只使用Fiddler,请求看起来很好。 – And

+0

如果你看看ControllerContext,你可以进入HttpContext并从那里到HttpRequest。然后您可以查看Form集合或QueryString集合。既然你发布了,我认为你的数据应该可以在Form集合中找到,但由于你没有使用序列化表单,我不确定会传达什么。 –

回答

0

您可能会看到this post和接受的答案。它暗示:

  1. 为了发布,你需要设置的形式的形式;
  2. 您需要删除dataType和contentType参数。

我想我已经知道了!您的contentType参数:

它必须是 “应用/ JSON的;字符集= UTF-8”

你已经得到了 “JSON” 之后的逗号。

+0

谢谢@AnnL,我之前将它作为序列化表单工作,但我想发布一个纯JSON,因此JSON.Stringify。我在其他问题上看到的其他实现可以很好地使用JSON序列化。 – And

+0

你能链接到你模拟的例子吗?也许我们[读者]可以发现差异。像,你确定这些例子包括一个POST? –

+0

好的,这里是一个很好的例子,您可以看到数据不是来自表单,而只是一个JavaScript对象。 [链接](http://code.msdn.microsoft.com/Post-Data-to-MVC-4-WEB-API-80386405) – And

0

检查控制器上的ModelState属性。在那里记录反序列化错误。你可能会发现为什么反序列化失败。

+0

尽管属性是基本类型并且名称相同,但很可能在反序列化中存在错误。但是我没有收到任何通知。明天早上我会按照你的建议。谢谢! – And

+0

我检查了ModelState.IsValid,它返回true。我设法在参数之前使用[ModelBinder]注释获取模型的实例,但属性设置为零。也就是说,当我发布数据时,出于某种原因,这些值被丢弃,并且使用具有“空”值的属性创建新实例,在int属性的情况下,这是一个零值。我感觉我正在接近... – And