Проверка и передача параметров уровня контроллера с помощью маршрутизации атрибутов ASP.NET MVC - PullRequest
1 голос
/ 02 октября 2019

У меня есть контроллер ASP.NET, где у каждого метода будет общий параметр. С помощью атрибута маршрутизации я могу добавить этот параметр в маршрут контроллера.

Однако мне все еще нужно добавить этот параметр вместе с атрибутом проверки в каждом отдельном методе. Есть ли способ для меня, чтобы сделать проверку в одном месте или избежать необходимости передавать ее в каждый метод?

Это текущий рабочий код:

[ApiController]
[Route("[controller]/{name}")]
public class ExampleController : ControllerBase
{
    [HttpGet]
    public string Sample([StringLength(10)][FromRoute]string name)
    {
    }

    [HttpGet]
    [Route("defaults")]
    public string GetDefaults([StringLength(10)][FromRoute]string name)
    {
    }

    [HttpGet]
    [Route("objects/{id}")]
    public string Sample([StringLength(10)][FromRoute]string name, [FromRoute]string id)
    {
    }
}

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

[ApiController]
[StringLength(10)]
[Route("[controller]/{name}")]
public class ExampleController : ControllerBase
{
    [HttpGet]
    public string Sample()
    {
    }

    [HttpGet]
    [Route("defaults")]
    public string GetDefaults()
    {
    }

    [HttpGet]
    [Route("objects/{id}")]
    public string Sample([FromRoute]string id)
    {
    }
}

Ответы [ 2 ]

1 голос
/ 03 октября 2019

Как сказал Хуман Бахрейни, вы можете настроить фильтр действий, который наследует ActionFilterAttribute , и использовать его в качестве атрибута на контроллере. В ядре Asp.net ActionArguments заменяет ActionParameters

public class ValidateNameParameterAttribute: ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (filterContext.ActionArguments.ContainsKey("name"))
        {
            string name = filterContext.ActionArguments["name"] as string;

            if(name!=null && name.Length>10)
            {
                filterContext.Result = new BadRequestObjectResult("The length of name must not exceed 10");
            }
        }
    }
}

Для получения дополнительной информации о фильтрах в ASP.NET Core вы можете обратиться к здесь .

1 голос
/ 03 октября 2019

Вы можете сделать это, используя фильтр пользовательских действий для проверки параметра имени:

public class ValidateNameParameterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (filterContext.ActionParameters.ContainsKey(name))
        {
            // the trick is to get the parameter from filter context
            string name = filterContext.ActionParameters[name] as string;

            // validate name

            if (/*name is not valid*/)
            {
                // you may want to redirect user to error page when input parameter is not valid
                filterContext.Result = new RedirectResult(/*urlToRedirectForError*/);
            }

            base.OnActionExecuted(filterContext);
        }
    }
}

Теперь вы можете применить фильтр к вашему контроллеру или выполнить определенные действия:

[ApiController]
[Route("[controller]/{name}")]
[ValidateNameParameter] // <-- execute this for all actions in the controller
public class ExampleController : ControllerBase
{
    [HttpGet]
    public string Sample([StringLength(10)][FromRoute]string name)
    {
    }

    [HttpGet]
    [Route("defaults")]
    public string GetDefaults([StringLength(10)][FromRoute]string name)
    {
    }

    [HttpGet]
    [Route("objects/{id}")]
    // [ValidateNameParameter] // <-- execute for this specific action
    public string Sample([StringLength(10)][FromRoute]string name, [FromRoute]string id)
    {
    }
}

См. этот учебник для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...