2015-11-03 67 views
0
I have a controller defined as follows 

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

namespace MissingClinics.Controllers 
{ 
    [RoutePrefix("api/appointment")] 
    public class AppointmentController : ApiController 
    { 
     [HttpPost] 
     public IHttpActionResult GetMissingKeys([FromBody]String MRNList) 
     { 
      return Ok(); 
     } 
    } 
} 

以下JavaScript調用該頁面。方法不允許在WebAPI中發帖

  try { 
       $.ajax({ 
        type: 'POST', 
        url: '/api/Appointment/GetMissingKeys', 
        data: $('#mrnList').val(), 
        dataType: 'text' 
       }).done(function() { 
        alert('done!'); 
       }).fail(function (Status, errorThrown) { 
        alert('Error: ' + Status.status + ' - ' + Status.statusText); 
       }).always(function() { 
        alert('All done or not'); 
       }); 
      } 
      catch (e) { 
       alert(e); 
      } 

WebApi.config如下

namespace MissingClinics 
{ 
    public static class WebApiConfig 
    { 
     public static void Register(HttpConfiguration config) 
     { 
      // Web API configuration and services 

      // Web API routes 
      config.MapHttpAttributeRoutes(); 

      config.Routes.MapHttpRoute(
       name: "DefaultApi", 
       routeTemplate: "api/{controller}/{id}", 
       defaults: new { id = RouteParameter.Optional } 
      ); 
     } 
    } 
} 

RouteConfig.cs

namespace MissingClinics 
{ 
    public class RouteConfig 
    { 
     public static void RegisterRoutes(RouteCollection routes) 
     { 
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

      routes.MapRoute(
       name: "Default", 
       url: "{controller}/{action}/{id}", 
       defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
      ); 
     } 
    } 
} 

現在,因爲我將要傳遞的數據相當數量的,我需要它傳遞中正文(而不是網址的一部分)。

但在調用中它返回錯誤405-方法不允許。但從我所看到的jquery應該發出一個post請求,並且控制器正在接受一個帖子 - 爲什麼Method不允許?

+0

請求數據中是否有HTML,如果是這樣的話,請在你的參數中使用'[AllowHtml]'屬性。 –

+0

不確定屬性路由是否將默認爲您的方法名稱...嘗試在您的方法上使用'[Route(「GetMissingKeys」))]。 – Jonesopolis

+0

沒有HTML,我也嘗試過路由屬性 –

回答

0

你是否將默認路線從api/{action}更改爲api/{controller}/{action}/{id}

的ASP.NET Web API與請求的HTTP方法選擇的動作,有以下兩種方式:

1.更改網絡API默認路由

WebApiConfig.cs

config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{action}/{id}", defaults: new { id = RouteParameter.Optional } );
有了這個,你不需要改變你的HTML文件。

2.Change你的動作名稱

public IHttpActionResult Post([FromBody]String MRNList)

,並調用JavaScript這樣的:

$.ajax("/api/Appointment", {type:"POST", data:$("").val() ... }

+0

不知道你的意思,但嘗試更改RouteConfig.cs中的網址,但這似乎沒有區別 –

1

於默認的路由模板,網頁API使用HTTP方法來選擇動作。但是,你也可以創造一個動作的名稱包含在URI路徑:

routes.MapHttpRoute(
    name: "ActionApi", 
    routeTemplate: "api/{controller}/{action}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 

Routing instructions

+0

我試過了 - 甚至扭轉了Route和HttpPost的順序 - 甚至嘗試過AcceptVerb –

+0

@PaulSChapman可以您請將您的Startup類實現添加到您的主題中?將試圖找出什麼是錯的。 –

+0

@PaulSChapman我改變了,並添加了一些額外的信息給我的答案。在文章的最後,您可以找到以下信息:按操作名稱路由。看看這個。 –

1

一段時間,因爲我用的jQuery但

不應該在該

data: $('#mrnList').val(), 

是這樣

data : {mrnList: $('#mrnList').val()}, //Or MrnList depending on your jsonformatting options 

另外dataType應該是'json'我認爲。

您是否嘗試過將[Route("GetMissingKeys")]添加到您的方法中?