У меня имя объекта из View совпадает с именем параметра метода контроллера.
Имя объекта не имеет значения, поскольку это просто имя переменной. Это в любом случае преобразуется в имя data
- ie data:BID
= data=BID
, поэтому «имя переменной», переданное через ajax, равно «data». свойства в этой переменной должны совпадать.
Краткий ответ: ваша переменная "data" нуждается в свойстве, которое соответствует имени параметра действия, ie:
data: { BID: BID },
Длинный (er) ответ: связыватель модели MVC попытается сопоставить имена свойств с именами ваших параметров. В этом случае вы затруднили себя, используя object 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 будет сопоставлять свойство data.BID
с именем вашего параметра напрямую (и тогда будут отображаться свойства внутри каждого из них).
Для покрытия:
Атрибут [HttpPost] в методе контроллера.
атрибут [HttpPost]
не делает его методом post - вместо ограничивает глагол http до POST. Вам, как правило, это не нужно. Это полезно, когда у вас есть два метода с одним и тем же именем, но с разными перегрузками, и один для GET с эквивалентным POST (где параметр GET просто id
, но POST - полная модель). Его также можно использовать в качестве дополнительной защиты.
В вашем случае вы попадаете внутрь действия (только с нулевым параметром), так что часть явно работает нормально.