Javascript Razor视图中的Ajax调用在控制器方法中发送空数据?

Javascript Razor视图中的Ajax调用在控制器方法中发送空数据?,javascript,jquery,ajax,asp.net-mvc,Javascript,Jquery,Ajax,Asp.net Mvc,我正在尝试使用razor视图中的ajax调用在控制器方法中进行一个简单的post调用。ajax调用确实调用了控制器方法,但它没有发送我试图发送的对象。我尝试了Stackoverflow中的多个解决方案,但均未成功,包括使用Json.stringify()方法和使用[HttpPost]属性。视图中的对象的名称与控制器方法参数的名称相同。这是我进行Ajax调用的脚本: $(文档).ready(函数(){ $('.send all')。在('click',function()上{ 变量数据=$('

我正在尝试使用razor视图中的ajax调用在控制器方法中进行一个简单的post调用。ajax调用确实调用了控制器方法,但它没有发送我试图发送的对象。我尝试了Stackoverflow中的多个解决方案,但均未成功,包括使用
Json.stringify()
方法和使用[HttpPost]属性。视图中的对象的名称与控制器方法参数的名称相同。这是我进行Ajax调用的脚本:


$(文档).ready(函数(){
$('.send all')。在('click',function()上{
变量数据=$('#垂直滚动tr').map(函数(){
var$row=$(此);
返回{
id:$row.find('.id').text().trim(),
companyName:$row.find('.companyName').text().trim(),
价格:$row.find('.price').text().trim(),
数量:$row.find('.quantity').text().trim(),
}
}).get();
var BID=[];
对于(变量i=0;i
MVC将尝试从模型属性绑定,因此应该有一个名为BID的属性

data: { BID: BID }
我的视图中对象的名称与控制器方法参数的名称相同

对象的名称是不相关的,因为它只是一个变量名。这将被转换为名称
data
,即
data:BID
=
data=BID
,因此通过ajax传递的“变量名”是“数据”。该变量中的属性需要匹配

简而言之,您的“数据”变量需要一个与操作参数名称匹配的属性,即:

data: { BID: BID },
答案很长(er),MVC模型绑定器将尝试将属性名称与参数名称匹配。在这种情况下,您使用
对象BID
而不是实际的模型,这给您自己造成了困难,因此没有要匹配的属性,因此它只能匹配参数本身

如果创建的模型与所传递的数据相匹配:

public class BIDModel {
    public string companyName { get;set; }
    public string price { get;set; }
    public string quantity { get;set; }
}
在你的行动中使用了它

public ActionResult UpdateBID(BIDModel BID) 
然后传递
data:BID
将起作用,因为
data
的属性将与
BIDModel
的属性相匹配-您仍然可以使用
data:{BID:BID}
,MVC模型绑定器将
数据.BID
属性与您的参数名称直接匹配(然后将映射每个属性中的属性)


涵盖:

控制器方法中的[HttpPost]属性

[HttpPost]
属性不使其成为post方法,而是将http谓词限制为post。通常不需要此属性。当您有两个名称相同但重载不同的方法,一个用于GET,另一个用于具有等效post的方法时,此属性非常有用(其中GET参数只是一个
id
,但POST是完整的模型)。它还可以用作附加安全性


在您的情况下,您正在进入操作(仅使用null参数)因此,这一部分显然工作正常。

对于任何感兴趣的人,我都意识到了问题所在。我试图将一个JavaScript对象数组发送给一个理论上接受这些对象数组的方法。显然,这不起作用。我所做的是在C中创建一个新对象,其属性具有UpdateOrder[],大概是这样的:

public class UpdateOrder
{
    public int id { get; set; }
    public string companyName { get; set; }
    public string price { get; set; }
    public int quantity { get; set; }
}

public class Term
{
    public UpdateOrder[] Terminal { get; set; }
}

我在Javascript中创建了一个类似的Term对象,并在controller方法中通过AJAX发送它。因此,我没有直接发送数组,而是创建了一个包含该数组的属性的对象。

data:BID,
->
数据:{BID:BID}
我尝试了这两种解决方案。我创建了一个映射到javascript对象的对象,并将其作为参数添加到控制器方法(UpdateOrder[]BID)中。我还尝试了以下数据:{BID:BID}作为控制器方法(object BID)的签名我得到了相同的结果,对象BID为null。我在javascript代码中添加了验证,以确保BID对象不为null,并在控制台中记录了数据,因此javascript对象不为null。我从中发送数据的视图是一个局部视图,我不知道将对象发送到控制器时是否会出现问题。我尝试调试我的t与fiddler一起,在文本视图中我收到“undefined=&undefined=”在JSON视图中,我有JSON=undefined。这是否意味着数据没有发送到控制器方法?值得一试:添加
traditional:true,
到ajax参数我发现了问题,我发布了一个答案。你知道为什么它会这样工作,而不是我在最初的帖子中是如何尝试的吗?