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) { ... } 

在请求正文中发送它可以避免任何有关电子邮件格式的问题。