简体   繁体   English

Web API 2中的自定义路由。无法到达控制器方法

[英]Custom routing in Web API 2. Failing to reach controller method

I have a method inside of my controller which I am trying to reach: 我想达到的控制器内部有一个方法:

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

        transaction.Commit();
    }

    return Ok();
}

I have another method in the controller which is also a POST and is the method which is actually being hit by my request (erroneously): 我在控制器中还有另一个方法,这也是一个POST,实际上是我的请求(错误地)击中的方法:

[HttpPost]
public PlaylistDto Create(PlaylistDto playlistDto)

Here's what my raw request information looks like: 我的原始请求信息如下所示:

在此处输入图片说明

Here's my routing: 这是我的路线:

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 }
        );

    }
}

Why on earth is it redirecting to the Create method? 为什么到底重定向到Create方法? The signature looks correct to me for being routed to the UpdateTitle method. 对于我来说,该签名对于路由到UpdateTitle方法而言是正确的。

First you need to create a class that contains all your form data. 首先,您需要创建一个包含所有表单数据的类。 You may be able to use your PlaylistDto class for this: 您可以为此使用PlaylistDto类:

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

Then change your UpdateTitle method to: 然后将您的UpdateTitle方法更改为:

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

        transaction.Commit();
    }

    return Ok();
}

Finally change your routing as follows: 最后,如下更改路由:

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 }
        );

    }
}

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

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM