基于内容类型的帖子路由消歧
本文关键字:路由 于内容 类型 | 更新日期: 2023-09-27 18:16:27
我使用ASP在VS2012中创建了一个简单的WebAPI项目。Net MVC 4。这就是我要做的。我想有两个基于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),因为路由似乎与类似的方法混淆。如果我注释掉其中一个,那么在所有情况下都会调用另一个。
这种精细的路由是否应该手动处理(不管它看起来有多尴尬),还是我缺少了一些东西(比如属性)。谢谢!
首先,创建以下类:
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";
}