【问题标题】:AmbiguousMatchException thrown for different bodies为不同的主体抛出 AmbiguousMatchException
【发布时间】:2019-06-26 13:45:32
【问题描述】:

我有两个发布到同一个 URL 的表单:http://localhost/foo/bar

<form method="POST" action="http://localhost/foo/bar">
    <input name="someId" value="123" />
</form>

<form method="POST" action="http://localhost/foo/bar">
    <input name="someData" value="345435435" />
</form>

而我在FooController中有以下操作:

[HttpPost("bar")]
public IActionResult A([FromForm] string someId)
{
    ...
}

[HttpPost("bar")]
public IActionResult B([FromForm] string someData)
{
    ...
}

但我收到了AmbiguousMatchException。我正在尝试做的事情可能吗?

【问题讨论】:

  • 您能考虑使用一个带有两个参数的方法吗?然后在方法内部根据需要进行分支。
  • 是的,我可以,如果我不能有 2 个动作,我最终会这样做,但我认为有 2 个动作会更干净。
  • FWIW,通常最好在操作中分支调用私有方法。这实现了相同的目标(保持代码分支分开),但仍然只剩下一个端点。虽然像ParameterContraint 属性这样的东西解决了这个有限的用例,但它并不能解决这种类型的所有需求,而且它也会让你的代码更难理解,即使只是很细微的。但是,如果您经常执行此类操作,跟踪请求的去向可能会变得更加困难。
  • 此外,虽然它对 MVC 的重要性不如对 API 的重要性,但仍然最好遵循 REST 准则,这将规定两种类型的请求需要两个 URL。
  • 我同意这一点,但不幸的是,我们有时不得不与不遵守准则的第三方打交道

标签: c# asp.net-core routing


【解决方案1】:

我用属性解决了!

public class ParameterConstraint : ActionMethodSelectorAttribute
{
    private readonly string _name;

    public ParameterConstraint(string name)
    {
        _name = name;
    }

    public override bool IsValidForRequest(RouteContext routeContext, ActionDescriptor action)
    {
        return !string.IsNullOrEmpty(routeContext.HttpContext.Request.Form[_name]);
    }
}
[HttpPost("bar")]
[ParameterConstraint("someId")]
public IActionResult A([FromForm] string someId)
{
    ...
}

[HttpPost("bar")]
[ParameterConstraint("someData")]
public IActionResult B([FromForm] string someData)
{
    ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-04
    • 1970-01-01
    • 1970-01-01
    • 2014-06-07
    • 1970-01-01
    相关资源
    最近更新 更多