如何在控制器中指示方法不是动作方法?

Ron*_*n C 2 c# asp.net-core-mvc asp.net-core asp.net-core-routing

我有一种情况,我想使用页面特定的控制器.在那个控制器中,我有一个动作方法和一堆辅助方法.在现实生活中,辅助方法是从a继承的,BaseController但为了简单起见,假设我只是在我的控制器类中直接有一个辅助方法,如下所示:

[Route("/dev/test")]
public class TestController : Controller {

    public IActionResult Get() {
        return UnprocessedEntityResult();
    }

    //Some helper method that I don't want to be considered an 
    //action method by the routing engine.
    public IActionResult UnprocessedEntityResult() {
        return StatusCode(StatusCodes.Status422UnprocessableEntity);
    }
}
Run Code Online (Sandbox Code Playgroud)

我特别想使用基于属性的路由,我希望在级别指定基于属性的路由.

鉴于上面编码的情况,AmbiguousActionException/dev/test访问路由时将抛出a 并且它将指示该情况

AmbiguousActionException:匹配多个动作.以下操作匹配路由数据并满足所有约束:

App.Dev.TestController.Get
App.Dev.TestController.UnprocessedEntityResult

如何告诉路由引擎UnprocessedEntityResult()不是动作方法?我假设必须有一些属性,我可以应用于该方法,但我一直无法找到它.

Nko*_*osi 5

查找[NonAction]属性.

表示控制器方法不是操作方法.

[Route("/dev/test")]
public class TestController : Controller {
    [HttpGet]
    public IActionResult Get() {
        return UnprocessedEntityResult();
    }

    [NonAction]
    public IActionResult UnprocessedEntityResult() {
        return StatusCode(StatusCodes.Status422UnprocessableEntity);
    }
}
Run Code Online (Sandbox Code Playgroud)

或者你也可以保护行动.

[Route("/dev/test")]
public class TestController : Controller {
    [HttpGet]
    public IActionResult Get() {
        return UnprocessedEntityResult();
    }

    protected IActionResult UnprocessedEntityResult() {
        return StatusCode(StatusCodes.Status422UnprocessableEntity);
    }
}
Run Code Online (Sandbox Code Playgroud)

它将对派生类型可见,但不会混淆路由表