c# WebAPIにajaxでclassをPOSTする(RoutePrefix付き)

c# WebAPIにajaxでclassをPOSTする(RoutePrefix付き)

いつも忘れてしまって何故404?と悩むのでメモ。

まず、WebAPIの引数に渡したいクラスを定義する

適当に。EMail、Nameというプロパティを持ったクラスを用意する。
とりあえず、/Models/Users.csを追加。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace WebAPIPostSample.Models
{
    public class User
    {
        public string EMail { get; set; }
        public string Name { get; set; }
    }
}

WebAPIの中身

/Controllers/Api/UsersController.csを追加。
Userを受け取って、何か処理をするという想定。
RoutePrefixを使って、URLにバージョンを埋め込む。
HttpPostを付加しているので、Routeは""になる。
これで
/api/v1/users
にPOSTすると、Postが呼び出される。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using WebAPIPostSample.Models;

namespace WebAPIPostSample.Controllers.Api
{
    [RoutePrefix("api/v1/users")]
    public class UsersController : ApiController
    {
        [HttpPost]
        [Route("")]
        public void Post([FromBody]User value)
        {
            var inputEmail = value.EMail;
            var inputName = value.Name;

            /* Do Anything */
        }
    }
}

ajaxを使用するview

/Views/Home/Index.cshtml
を編集する。

@{
    ViewBag.Title = "Home Page";
}

<div class="row">
    <div class="col-md-12">
        <h2>Ajax Postサンプル</h2>
        <div class="form-group">
            <label for="email">Email address:</label>
            <input type="email" class="form-control" id="email">
        </div>
        <div class="form-group">
            <label for="name">Name:</label>
            <input type="text" class="form-control" id="name">
        </div>
        <div class="form-group">
            <button id="btnDoPost" class="btn btn-primary">送信</button>
        </div>
    </div>
</div>
@section scripts {

<script type="text/javascript">
    $(document).ready(function () {
        $("#btnDoPost").on({
            click: function () {
                var user = { 'EMail': $("#email").val(), 'Name': $("#name").val() };
                $.ajax({
                    type: "post",
                    contentType: "application/json; charset=utf-8",
                    url: "/api/v1/users",
                    data: JSON.stringify(user),
                    cache: false,
                    async: true,
                });

                return false;
            },
        });
    });
</script>

}

ポイント

JSON.stringifyがポイント。
例えば、
data = { EMail: "hoge@fuga.com", "Name": "Hatena太郎" }
なんてしちゃうと、POSTした時に404になってしまうので注意!!