jQuery POST中的布尔值到MVC5控制器

时间:2017-08-02 13:03:13

标签: javascript jquery asp.net-mvc asp.net-mvc-5

我正在使用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可以理解的东西可能有一个怪癖,但如果我在方法签名中使用字符串,则会发生同样的情况。导致它失败的唯一原因似乎是中间布尔变量。

3 个答案:

答案 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数据的新方法。