MVC5应用程序没有点击我的WebAPI2 POST方法来创建新记录

时间:2013-12-31 15:10:22

标签: c# asp.net-mvc-4 asp.net-web-api asp.net-mvc-5

我有一个MVC5应用程序,ASP.NET,在创建新记录并单击提交时,它会调用我的WebAPI(版本2 - 新版本)将记录插入数据库。问题是,它没有在我的WebAPI中使用POST方法。无论如何,这是我的MVC5,“创建”的前端应用程序代码:

[HttpPost]
        public ActionResult Create(BulletinBoard bulletinBoard)
        {
            bulletinBoard.CreatedDate = DateTime.Now;
            bulletinBoard.CreatedBy = HttpContext.User.Identity.Name;

            response = client.PostAsJsonAsync("api/bulletinboard", bulletinBoard).Result;
            if (response.IsSuccessStatusCode)
            {
                return View("Index");
            }
            else
            {
                LoggerHelper.GetLogger().InsertError(new Exception(string.Format(
                    "Cannot create a new feedback record due to HTTP Response Status Code not being successful: {0}", response.StatusCode)));
                return View("Problem");
            }
        }

我已经在构造函数中定义了“client”并为其提供了我的WebAPI的基本URL - 请记住GET有效 - 所以这对我的URL没有问题。我也可以手动转到我的WebAPI URL并在浏览器中获取数据。

这是我的WebAPI代码:

// POST api/bulletinboard
public HttpResponseMessage PostBulletinBoard(BulletinBoard bulletinBoard)
{
    if (ModelState.IsValid)
    {
        db.BulletinBoards.Add(bulletinBoard);
        db.SaveChanges();

        HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created, bulletinBoard);
        return response;
    }
    else
    {
        return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
    }
}

当我使用WebAPI版本1时,这有效,它对GET和POST和PUT方法有不同的命名约定。

因此,当调用POST请求的URL(响应= client.PostAsJsonAsync ...的行)时,请求永远不会在我的WebAPI中访问我的POST方法,因此,没有记录插入到我的数据库中。我做错了什么?

2 个答案:

答案 0 :(得分:1)

根据评论,您似乎已发布无效数据(根据您在BulletinBoard模型中定义的验证规则),此验证失败。因此,要解决此问题,请确保发送有效数据。

答案 1 :(得分:0)

我认为可能有一些原因导致它没有达到你的post方法。这是我的Post方法示例。您应注意的事项是方法名称 FromBody属性

public async Task<HttpResponseMessage> Post([FromBody]FoodProduct foodProduct)
{
      UnitOfWork.FoodRepository.Edit(foodProduct);
      await UnitOfWork.SaveAsync();
      return Request.CreateResponse(HttpStatusCode.OK);
}

我也喜欢在我的控制器上使用这个新的RoutePrefix属性,它工作得很好,看起来不错。

[RoutePrefix("api/Food")]
public class FoodController : BaseApiController
{
   ///some code here
}