我正在使用jQuery将一些数据发布到MVC 5控制器上的ActionMethod。当其中一个参数为true
时,一切正常,但当它为false
时,我会得到一个404。
这很好(HTTP 200)
var data = { userId: userId, approve: true, reason: 'Unaccepted'};
$.post('approve-user', data, function (response) {
...
这导致404
var data = { userId: userId, approve: false, reason: 'Unaccepted'};
$.post('approve-user', data, function (response) {
...
我的行动方法有这个签名:
[POST("approve-user")]
public async Task<JsonResult> ApproveOrRejectPost(int userId, bool approve, string reason) {
我认为将JS布尔值转换为.NET可以理解的东西可能有一个怪癖,但如果我在方法签名中使用字符串,则会发生同样的情况。导致它失败的唯一原因似乎是中间布尔变量。
答案 0 :(得分:1)
我想也许bool的位置正在提出我不确定的问题,但我可以建议你快速解决,因为ts显示404错误这意味着当bool值为false时无法找到你的行动
在您的行动中尝试此操作
public async Task<JsonResult> ApproveOrRejectPost(int userId, bool approve = false, string reason) {
尽管也尝试在客户端和服务器端交换参数 并检查结果
public async Task<JsonResult> ApproveOrRejectPost(int userId, string reason, bool approve) {
答案 1 :(得分:1)
我认为这可能只是MVC对您发送的数据进行反序列化的方式。 approve
为假可能只是从线路上发送的数据中省略。我说这是因为路由器无法在动作签名中解析没有 approve
的方法,因此它返回404(NotFound)。我不完全确定。添加从签名中删除approve
的相同操作,看看会发生什么:)
要解决这个问题,我认为这可能会对您有所帮助:
我建议创建一个为传入数据建模的对象:
public class ApprovalMetadata
{
public int userId { get; set; }
public bool approve { get; set; }
public string reason { get; set; }
}
然后在你的动作中使用这个对象:
public async Task<JsonResult> ApproveOrRejectPost([FromBody] ApprovalMetadata data)
{
...
}
[FromBody]
将您发送的正文中的JSON反序列化到ApprovalMetadata
对象中。
希望这有帮助!
答案 2 :(得分:0)
看起来这与MVC4的AttributeRouting包和MVC5中的内置属性路由之间的冲突有关。该应用程序已从MVC4更新,但旧的属性路由库仍在使用。将其拆除并替换为MVC5的内置属性路由解决了这个问题。
感谢@Ahmed Zaman提出了一种接受控制器中POST数据的新方法。