2

Ajax 呼び出しを行うと「404 Not Found」が表示されます。おそらく、ルーティングの仕組みを理解していないためです...

function ApproveAlert(ID) {
     $.ajaxPost('/api/DeviceApi/ApproveAlertNew', { 'ID': ID }, function (data) {
        ... get error "404 Not Found"
    }, null);
}

私のmvc4 C#アプリには、ルーティング構成があります:

RouteTable.Routes.MapHttpRoute(
                 name: "defaultapiaction",
                 routeTemplate: "api/{controller}/{action}"
             );
            RouteTable.Routes.MapHttpRoute(
                 name: "defaultapiid",
                 routeTemplate: "api/{controller}/{action}/{id}"
             );

および apicontroller :

public class DeviceApiController : ApiController
    {
        //
        // GET: /DeviceApi/
        [HttpPost]
        public bool ApproveAlertNew(int ID)
        {
            ..do
        }
4

2 に答える 2

0

Web API コントローラーは、MVC コントローラーと同じ意味で「アクション」を使用しません。[HttpPost]Web API コントローラーも実際には,[HttpGet]属性を使用しません。ApiControllers 内のメソッドの名前に基づいてリクエストをディスパッチします。MVC とは似ていますが、起動して実行するのが難しい場合があるため、MVC との Web API の違いについてもう少し読むことをお勧めします...

テスト用に作成した Web API のかなり一般的な例を次に示します。.NET WPF アプリから投稿していたため、この API に投稿する JavaScript がありません。「/Important/Post」ではなく「/Important」に投稿します。うまくいけば、これで正しい軌道に乗ることができます...

WebAPIConfig.cs (ルート):

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

namespace ArrayTest.WebAPI
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }
    }
}

API コントローラー:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using ArrayTest.Models;
using System.Threading;

namespace ArrayTest.WebAPI.Controllers
{
    public class ImportantController : ApiController
    {
        // POST api/important
        public HttpResponseMessage Post(ImportantList values)
        {
            //manipulate values received from client
            for (int i = 0; i < values.ImportantIDs.Count; i++)
            {
                values.ImportantIDs[i] = values.ImportantIDs[i] * 2;
            }

            //perhaps save to database, send emails, etc... here.

            Thread.Sleep(5000); //simulate important work

            //in my case I am changing values and sending the values back here.
            return Request.CreateResponse(HttpStatusCode.Created, values);
        }

    }
}

モデル:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ArrayTest.Models
{
    public class ImportantList
    {
        public List<int> ImportantIDs { get; set; }
    }
}
于 2013-03-03T18:37:48.557 に答える
0

あなたは試してみることができますか:

function ApproveAlert(ID) {
    $.ajax({
        type: 'POST',
        url: "/api/DeviceApi/ApproveAlertNew",
        data: {
            ID: ID
        },
        success: function (data) {
            //Handle your success
        },
        error: function (jqXHR, textStatus, errorThrown) {
            //Handle error
        }
    });
}
于 2013-03-03T18:48:17.927 に答える