Web API中的自定义路由2.未能达到控制器方法

时间:2014-03-11 18:02:01

标签: c# asp.net-web-api-routing asp.net-web-api2

我想在控制器内部使用一种方法:

[HttpPost, ActionName("UpdateTitle")]
public IHttpActionResult UpdateTitle(Guid playlistId, string title)
{
    using (ITransaction transaction = Session.BeginTransaction())
    {
        PlaylistManager.UpdateTitle(playlistId, title);

        transaction.Commit();
    }

    return Ok();
}

我在控制器中有另一个方法,它也是一个POST,实际上被我的请求(错误地)命中的方法:

[HttpPost]
public PlaylistDto Create(PlaylistDto playlistDto)

以下是我的原始请求信息:

enter image description here

这是我的路线:

public static class WebApiConfig
{
    //  TODO: Create test cases for custom routing.
    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services
        config.Routes.MapHttpRoute("UpdateTitle", "Playlist/UpdateTitle/{playlistId}/{title}");

        //  TODO: What does this do?
        // Web API routes
        //config.MapHttpAttributeRoutes();

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

    }
}

为什么它重定向到Create方法呢?签名对于我来说是正确的,因为它被路由到UpdateTitle方法。

2 个答案:

答案 0 :(得分:1)

首先,您需要创建一个包含所有表单数据的类。您可以使用PlaylistDto类:

public class PlaylistDto
{
    public Guid PlaylistId { get; set; }
    public string title { get; set; }
}

然后将UpdateTitle方法更改为:

[HttpPost, ActionName("UpdateTitle")]
public IHttpActionResult UpdateTitle(PlaylistDto Dto)
{
    using (ITransaction transaction = Session.BeginTransaction())
    {
        PlaylistManager.UpdateTitle(Dto.playlistId, Dto.title);

        transaction.Commit();
    }

    return Ok();
}

最后更改您的路由,如下所示:

public static class WebApiConfig
{
    //  TODO: Create test cases for custom routing.
    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services
        config.Routes.MapHttpRoute(
            name: "UpdateTitle",
            routeTemplate: "Playlist/UpdateTitle",
            defaults: new { controller = "PlaylistController", action = "UpdateTitle" }
         );    

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

    }
}

答案 1 :(得分:0)

尝试声明这样,看看是否有帮助(因为我相信你在请求正文中发送参数:

public IHttpActionResult UpdateTitle([FromBody]Guid playlistId, [FromBody]string title)