如何指示控制器中的方法不是操作方法?

问题描述 投票:0回答:1

我有一种情况,我想使用页面特定的控制器。在该控制器中,我有一个操作方法和一堆辅助方法。在现实生活中,辅助方法是从

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);
    }
}

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

鉴于上面编码的情况,当访问

AmbiguousActionException
路由时,将抛出
/dev/test
并指示

AmbigouslyActionException:匹配多个操作。 以下操作与路线数据匹配并满足所有约束:

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

我如何告诉路由引擎

UnprocessedEntityResult()
不是一个操作方法?我认为一定有一些属性可以应用于该方法,但我一直无法找到它。

c# asp.net-core asp.net-core-mvc asp.net-core-routing
1个回答
12
投票

查找

[NonAction]
属性。

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

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

    [NonAction]
    public IActionResult UnprocessedEntityResult() {
        return StatusCode(StatusCodes.Status422UnprocessableEntity);
    }
}

或者您也可以使该操作受到保护。

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

    protected IActionResult UnprocessedEntityResult() {
        return StatusCode(StatusCodes.Status422UnprocessableEntity);
    }
}

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

© www.soinside.com 2019 - 2024. All rights reserved.