Проверка модели работает даже без ModelState.IsValid netcore3 - PullRequest
0 голосов
/ 02 ноября 2019

Я бы не сказал, что это проблема, но мне просто интересно. Так что я только начал использовать .net для веб-API, я обычно использовал ноды или Python, потому что они быстрее строятся, пока что это здорово.

Во всяком случае, в моем методе контроллера (пост), Добавлениеусловие (ModelState.IsValid) не имеет значения.

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

[Route("api/[controller]")]
[ApiController]
public class PeopleController : ControllerBase
{
    private readonly IEntityRepository _entityRepository;

    public PeopleController(IEntityRepository entityRepository)
    {
        _entityRepository = entityRepository;
    }

    [HttpPost]
    public ActionResult<Person> Create(Person person) 
    {
        // if(!ModelState.IsValid){
        //     return new OkObjectResult("wrong shit");
        // } 
        // person.CreatedAt = DateTime.Now;
        // person.Tags = new List<string>();
        // person.Tags.Add($"id+@{person.Id}");
        // person.Tags.Add($"ar+:-{person.Archived}");
        // person.Id = MongoDB.Bson.ObjectId.GenerateNewId().ToString();
        // _entityRepository.Create(person);
        // return person;
        return null;
    }

}


public interface IEntityRepository {

   void Create(Person person);

}

public class EntityRepository : IEntityRepository
{
    private readonly IMongoCollection<Person> _entities;
    public EntityRepository(IConfiguration config)
    {
        var client = new MongoClient(config.GetConnectionString("TestConn"));
        var database = client.GetDatabase("TestDB");
        _entities = database.GetCollection<Person>("Person");
    }

    public void Create(Person person)
    {
        _entities.InsertOne(person);
    }
}


public class Person : IEntity
{
    public string Id { get; set; }

    [Required(ErrorMessage="Name is required")]
    [MinLength(10, ErrorMessage = "Name must be longer than 10 characters")]
    [MaxLength(20, ErrorMessage = "Name must be shorter than 20 characters")]
    public string Name {get;set; }
    [EmailAddress(ErrorMessage = "Enter valid email")]
    [ValidEmail(AllowedDomain = "gmail.com", ErrorMessage = "Invalid email")]
    public string Email {get;set;}
    [Phone(ErrorMessage = "Invalid phone")]
    public string phone {get;set;}
    [BsonElement("archived")]
    public bool Archived { get; set; }

    [BsonElement("tags")]
    public List<string> Tags { get; set; }

    [Required]
    [BsonElement("something")]
    public Something Rotation {get;set;}
}

Когда я добавляю это к почтальону

{
    "name": "sssssssssssssssssss",
    "phone": "2323-2323-2323",
    "email": "sd@gmail.com",
    "rotation": { "name": "g"}
}

Это все еще подтверждает

{
    "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
    "title": "One or more validation errors occurred.",
    "status": 400,
    "traceId": "|b6721095-496abaabbf3dbf66.",
    "errors": {
        "Rotation.Name": [
            "The field Name must be a string or array type with a minimum length of '10'."
        ]
    }
}

1 Ответ

2 голосов
/ 02 ноября 2019

Неважно, только что увидел это https://docs.microsoft.com/en-us/aspnet/core/mvc/models/validation?view=aspnetcore-3.0

Контроллеры Web API не должны проверять ModelState.IsValid, если они имеют атрибут [ApiController]. В этом случае автоматический ответ HTTP 400, содержащий сведения о проблеме, возвращается, когда состояние модели недопустимо. Для получения дополнительной информации см. Автоматические ответы HTTP 400.

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