1

我生成一個實體框架API控制器,現在我想新的方法添加到它:ASP.NET實體框架API控制器添加方法不工作

[ResponseType(typeof(LCPreview))] 
public IHttpActionResult ValidateEmail(string email) 
{ 
    LCPreview lCPreview = db.Data.Find(5); 
    if (lCPreview == null) 
    { 
     return NotFound(); 
    } 

    return Ok(lCPreview); 
} 

但是當我運行此,我得到這個錯誤:

The request is invalid. The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int32' for method 'System.Web.Http.IHttpActionResult GetLCPreview(Int32)' in 'Astoria.Controllers.PreviewLCAPIController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.

public static void Register(HttpConfiguration config) 
{ 
    config.MapHttpAttributeRoutes(); 

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

你檢查了從db.Data.Find調用返回的對象嗎?它可能對id字段有一個空值。 –

+0

我放了一個斷點,它沒有在所有 – user979331

+1

路線衝突中碰到這個新方法。它正在擊中符合請求的另一條路線。顯示如何配置您的路線設置。並請求url – Nkosi

回答

1
通過約定基於路由的路由表是無法在兩個動作之間的區別

,並基於Get選擇GetLCPreview行動前綴約定。

鑑於您的路由配置已啓用屬性路由,這意味着可以使用參數約束來幫助區分路由。

[RoutePrefix("api/PreviewLCAPI")] 
public class PreviewLCAPIController : ApiController { 

    //GET api/PreviewLCAPI/5 <- only when the value is an int will it match. 
    [Route("{id:int}")] 
    [HttpGet] 
    public IHttpActionResult GetLCPreview(int id) { ... } 

    //GET api/PreviewLCAPI/[email protected]/ 
    [Route("{email}"] 
    [HttpGet] 
    [ResponseType(typeof(LCPreview))] 
    public IHttpActionResult ValidateEmail(string email) { ... } 
} 

請注意,電子郵件中的點(。)在最後輸入時不帶斜槓(/)會導致一些問題。該框架會認爲它正在尋找一個文件並出錯。

如果意圖是發送電子郵件地址,那麼請使用POST並在正文中包含電子郵件。

//POST api/PreviewLCAPI 
[Route("")] 
[HttpPost] 
[ResponseType(typeof(LCPreview))] 
public IHttpActionResult ValidateEmail([FromBody] string email) { ... } 

在請求正文中發送它可以避免任何有關電子郵件格式的問題。