Как указать, что метод в контроллере не является методом действия?

У меня есть ситуация, когда я хочу использовать контроллер для конкретной страницы. В этом контроллере у меня есть метод действия и куча вспомогательных методов. В реальной жизни вспомогательные методы наследуются от 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);
    }
}

Я специально хочу использовать маршрутизацию на основе атрибутов, и я хочу, чтобы этот маршрут на основе атрибутов был указан на уровне класса.

Учитывая ситуацию, описанную выше, при доступе к маршруту /dev/test будет выдано AmbiguousActionException, и это будет означать, что

AmbiguousActionException: совпадение нескольких действий. Следующие действия соответствовали данным маршрута и удовлетворяли всем ограничениям:

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

Как я могу сообщить механизму маршрутизации, что UnprocessedEntityResult() не является методом действия? Я предполагаю, что должен быть какой-то атрибут, который я могу применить к методу, но я не смог его найти.


person RonC    schedule 12.04.2018    source источник
comment
найдите атрибут NonAction. или вы также можете сделать действие защищенным. Он будет виден производным типам, но не будет путать таблицу маршрутизации.   -  person Nkosi    schedule 12.04.2018


Ответы (1)


Найдите [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);
    }
}

Он будет виден производным типам, но не будет путать таблицу маршрутизации.

person Nkosi    schedule 12.04.2018