根据内容类型发布路由消歧

时间:2013-06-03 08:58:20

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

我使用ASP.NET MVC 4在VS2012中创建了一个简单的WebAPI项目。这是我想要做的。我希望有两个基于POST的操作采用相同的URL。我需要一个接受application/x-www-form-urlencoded并使用FormDataCollection路由到该方法,然后另一个操作是路由到另一个方法的无内容POST。请参阅下面的简化代码。

public class SampleController : ApiController
{
    public string Post(string x, int y, FormDataCollection data)
    {
        return "Post 1";
    }

    public string Post(string x, int y)
    {
        return "Post 2";
    }

}

现在,当我尝试发布(2个调用,一个使用application/x-www-form-urlencoded而另一个没有内容类型或text/plain)时,我收到内部服务器错误(500),因为路由似乎感到困惑用类似的方法。如果我注释掉这两个中的任何一个,那么在所有场景中都会调用另一个。

是否应该手动处理这种精细路由(无论它看起来多么笨拙),或者是否存在我遗漏的东西(如属性)。谢谢!

1 个答案:

答案 0 :(得分:-1)

首先,创建以下类:

public class ButtonAttribute : ActionMethodSelectorAttribute
{
    public string ButtonName { get; set; }
    public override bool IsValidForRequest(
        ControllerContext controllerContext, 
        System.Reflection.MethodInfo methodInfo)
    {
        return controllerContext.Controller.ValueProvider
            .GetValue(ButtonName) != null;
    }
    public ButtonAttribute(string buttonName)
    {
        ButtonName = buttonName;
    }
}

然后,在视图中,将name属性添加到按钮:

<form action="~/Sample/Post" method="post">
    <input type="text" name="x" value="test" />
    <input type="number" name="y" value="123" />
    <input type="submit" value="First button" name="submit1" />
    <input type="submit" value="Second button" name="submit2" />
</form>

最后,在您的控制器中,添加Button属性,如下所示:

[Button("submit1")]
public string Post(string x, int y, FormDataCollection formData)
{
    return "Post 1";
}

[Button("submit2")]
public string Post(string x, int y)
{
    return "Post 2";
}