过载控制器

时间:2018-07-12 07:21:23

标签: c# asp.net-mvc asp.net-core

是否可以在C#中使用不同的参数调用相同的URL?例如,如果我这样做,将导致AmbiguousActionException

    [HttpPost("SetDog")]
    public async Task<bool> SetDog([FromBody] Affenpinscher affenpinscher)
    {
        ...
    }

    [HttpPost("SetDog")]
    public async Task<bool> SetDog([FromBody] Bulldog bulldog)
    {
        ...
    }

我知道我可以更改控制器的名称,但这不是一个选择。所有请求的URL都必须相同,但唯一的变化将是接收到的参数。

所有请求的网址均为www.foo.com/Dogs/SetDog

P.S:不要只关注狗的例子,原因只是为了解释问题

2 个答案:

答案 0 :(得分:0)

不。您可以通过使该URL接受Object,然后对其进行分析以猜测其类型来实现类似的目的。但是.net样式类型重载无法使用这些控制器完成,因为输入不是真正的强类型。

答案 1 :(得分:0)

为MVC定义一个操作选择器,以了解要触发哪种操作方法

[RouteDogToAction("affenpinscher")]
public async Task<bool> SetDog([FromBody] Affenpinscher affenpinscher)
{ 
    //Implementation 
}

[RouteDogToAction("bulldog")]
public async Task<bool> SetDog([FromBody] Bulldog bulldog) 
{ 
    //Implementation
}

覆盖ActionMethodSelectorAttribute

public class RouteDogToActionAttribute : ActionMethodSelectorAttribute 
{

    public RequireRequestValueAttribute(string dogType) 
    {
        DogType = dogType;
    }
    public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo) 
    {
        return (controllerContext.HttpContext.Request[DogType] != null);
    }

    public string DogType { get; private set; }

}
相关问题