Проверка ввода API на основе входного параметра

В моем контроллере у меня есть что-то вроде этого:

public async Task<Teacher?> GetTeacher(string id){}

Все, что я хочу сделать, это добавить что-то вроде BadRequest() или любую другую подходящую вещь для id проверки входного параметра. и логика примерно такая:

    if (id == "nah")
    {
        return BadRequest();
    }

Что ж, проблема, с которой я столкнулся, заключается в том, что мой контроллер строго типизирован для Task<Teacher?>, и это нормально, когда я нахожу результат и возвращаю его этого типа, но он не будет компилироваться/не может сейчас привести, если у меня есть return BadRequest();

Итак, каков простой способ выполнить такую ​​​​суперпростую проверку параметров?

Можно ли сделать BadRequest() собственностью или коллекцией Teacher? Или использовать наследование, чтобы Teacher наследовал класс BadRequest?

devlin carnate 04.04.2024 00:36

Просто заставьте его возвращать ActionResult<T>, например (в вашем асинхронном случае Task<ActionResult<Teacher?>>

flackoverstow 04.04.2024 01:00

@devlincarnate «Или используйте наследование».. Нееет

flackoverstow 04.04.2024 01:03

@flackoverstow - почему неееет?

devlin carnate 04.04.2024 21:18
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

С помощью WebAPI2, аннотируя свой метод с помощью [HttpGet("/GetTeacher/{id:string})"], вы можете напрямую добавить некоторую проверку — также см. возможность регулярного выражения в первой ссылке ниже, которая может помочь вам с более сложной проверкой. Вы можете попытаться изменить тип возвращаемого значения на IActionResult и возвращать что-то вроде Ok(FoundTeacher) в случае успеха, возвращая BadRequest при ошибке проверки.

Ограничения маршрутов в WebAPI2 - MSDC
Типы возвращаемых значений в WebAPI — MSDC

Хорошие варианты. буду изучать ссылки

Bohn 04.04.2024 01:47

Обратите внимание, что ограничения маршрута приведут к ошибке 404 для несовпадающих запросов. Другими словами, у вас может быть два маршрута «/{id:int}» и «/{name}». Второй маршрут будет использоваться только для нечисловых запросов.

Jeremy Lakeman 04.04.2024 03:57

Я решаю эту ситуацию следующим образом:

Создайте класс ошибок:

public class PersistantEntity
{
    public ModelStateDictionary Errors { get; set; }
}

Это не обязательно типа ModelStateDictionary. Используйте тот тип, который лучше всего подходит для ваших ошибок.

И тогда ваш класс Teacher сможет наследовать класс PersistentEntity:

public class Teacher : PersistantEntity
{
}

И затем вы можете сослаться на это в контроллере с помощью:

 model.Errors = new ModelStateDictionary();
 //do something with model.Errors

И вы просто вернете model (типа Teacher) из своего контроллера, а затем сделаете все, что угодно с model.Errors во всем, что обрабатывает возврат.

Лично я выполняю проверку методом, содержащимся в модели, а не в контроллере. Но затем я вызываю его из контроллера с помощью:

 model.Validate();
 //then do something with model.Errors

Хорошая идея . У меня просто нет модельного класса. Это просто класс POCO DTO и входной параметр.

Bohn 04.04.2024 01:48

Другие вопросы по теме