【问题标题】:Ajax mvc api: bad request when sending viewmodelAjax mvc api:发送视图模型时请求错误
【发布时间】:2017-09-17 03:00:45
【问题描述】:

我正在使用 Ajax 向我的 web api 发送一个请求,用 c# 编写。 我正在发送一个视图模型,但我收到一个错误的请求错误。 这是我的代码:

[HttpPut]
/*api controller*/
public IHttpActionResult UpdateCursoProfesor(int CourseId, CourseViewModel ViewModel)
{
/*Do something*/
return Ok(result);
}

这是我的视图模型:

public class CursoViewModel
{
[MaxLength(125)]
public string Tittle{ get; set; }
public string Description { get; set; }
}

这是我的 ajax

 function GeneralPost(CursoDto) {

            $.ajax({
                async: true,
                url: "http://localhost:59245/api/ProfesorCurso?CourseId=123",
                type: "Put",
                dataType:'json',
                data: JSON.stringify({

                    Tittle: 'My tittle',
                    Description: 'I am describing yea'
                }),
                success: function (data) {
                    alert ('we did it!')
                },
                error: function (msg) { alert('bad bad'); }
            });
        }

当我在 ajax 请求中不包含“数据”时,我可以到达我的 api 控制器,但是当我包含数据时,出现异常: http://localhost:59245/api/ProfesorCurso?CourseId=400 错误请求

关于我做错了什么的任何提示?谢谢

【问题讨论】:

  • 检查请求标头,特别是 Content-Type。当标头与内容格式不匹配时,通常会返回 Bad Request。

标签: c# jquery ajax asp.net-mvc


【解决方案1】:

CourseId 参数类型为Guid。动作链接 CourseId 参数不是Guid "http://localhost:59245/api/ProfesorCurso?CourseId=123",

使ActionResult方法参数typeint或将正确的Guidview发送到controller

public IHttpActionResult UpdateCursoProfesor(int CourseId, CourseViewModel ViewModel)
{
/*Do something*/
return Ok(result);
}

【讨论】:

  • 你好,谢谢。正如你所说,我已经改变了,但错误仍然存​​在。当我不包含数据时,它将请求传递给 api 控制器,但 Api 中的 Viewmodel 对象为空。但是,当我包含数据时,会出现 400 错误
【解决方案2】:

整个事情看起来不正确

首先,url 必须包含控制器 AND 操作,除非您遵循显然不遵循的 REST 原则。

假设你的控制器叫做 ProfesorCursoController 那么你的 url 应该是这样的:

http://localhost:59245/api/ProfesorCurso/UpdateCursoProfesor

现在,由于您发出 PUT 请求,因此您的数据应该在请求正文中,而不是在 URL 中。

我会确保您的 ViewModel 也包含 courseID 并将其与标题和描述一起解析。

你的控制器看起来像这样:

[HttpPut]
/*api controller*/
public IHttpActionResult UpdateCursoProfesor([FromBody] CourseViewModel ViewModel)
{
/*Do something*/
return Ok(result);
}

你的javascript:

function GeneralPost(CursoDto) {

            $.ajax({
                async: true,
                url: "http://localhost:59245/api/ProfesorCurso/UpdateCursoProfesor",
                type: "PUT",
                dataType:'json',
                data: JSON.stringify({
                    CourseID : some GUID not int!
                    Tittle: 'My tittle',
                    Description: 'I am describing yea'
                }),
                success: function (data) {
                    alert ('we did it!')
                },
                error: function (msg) { alert('bad bad'); }
            });
        }

最后是你的 ViewModel:

public class CourseViewModel 
{
     public Guid CourseID { get;set; }
     public string Tittle { get;set; } 
     public string Description { get;set; }
}

【讨论】:

  • 感谢您的澄清,不幸的是,我遇到了同样的问题,当我不包含 data:json..... 时,put 请求通过控制器和 viewmodel 对象参数是空的。但是当我使用这种方法时,我遇到了错误的请求错误,并收到警报“bad Bad”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-02
  • 2021-01-14
  • 2016-01-06
  • 2021-02-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多