Как проверить, является ли атрибут электронной почты уникальным в ASP .NET CORE API? - PullRequest
0 голосов
/ 12 июня 2019

Мне нужно было сделать сообщение или поставить проверку на стороне сервера, чтобы проверить, является ли электронная почта уникальной.

В исследовании, которое я всегда делал, пример был традиционным приложением MVC и никогда не являлся API-интерфейсом..

Во многих случаях я видел, что [Remote] https://docs.microsoft.com/pt-br/aspnet/core/mvc/models/validation?view=aspnetcore-2.2#remote-attribute.Я попытался реализовать в соответствии с документацией, но отладка подтвердила, что функция в контроллере также не вызывается.

User.cs

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.AspNetCore.Mvc;

namespace Base.Models
{
    [Table("users")]
    public partial class User
    {
        ...
        [Required]
        [EmailAddress]
        [Remote(action: "VerifyEmail", controller: "UserController",ErrorMessage="Email already in use")]
        [Column("email", TypeName = "varchar(254)")]
        public string Email { get; set; }
        ...
    }
}

UserController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Base.Models;

namespace Base.Controllers
{
    [Route("api/users")]
    [ApiController]
    public class UserController : Controller
    {
        ...
        [AcceptVerbs("Get")]
        public IActionResult VerifyEmail(string email)
        {
            //forcing it to go wrong
            return Json($"Email {email} is already in use.");
        }
        ...
    }
}

У кого-нибудь есть идеи, как это реализовать?

Ответы [ 2 ]

1 голос
/ 12 июня 2019

Я не могу комментировать, потому что у меня нет достаточной репутации, и если бы у меня было время, я бы пошел и проверил, но я думаю, что ваша проблема здесь - [Маршрут ("api / users")].Вы даете своему декоратору имя контроллера, но этот контроллер находится за другим маршрутом.Легкой отладкой для этого будет временное удаление Маршрута ИЛИ установка действия «VerifyEmail» на другой контроллер, для которого вы не изменяете его маршрут.

0 голосов
/ 12 июня 2019

Видя, что это не происходит, я решил провести персональную проверку.

EmailUserUniqueAttribute.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;
using Base.Models;

namespace Core.Models
{
    public class EmailUserUniqueAttribute : ValidationAttribute
    {
        protected override ValidationResult IsValid(
            object value, ValidationContext validationContext)
        {
            var _context = (AppDbContext)validationContext.GetService(typeof(AppDbContext));
            var entity = _context.Users.SingleOrDefault(e => e.Email == value.ToString());

            if (entity != null)
            {
                return new ValidationResult(GetErrorMessage(value.ToString()));
            }
            return ValidationResult.Success;
        }

        public string GetErrorMessage(string email)
        {
            return $"Email {email} is already in use.";
        }
    }
}

User.cs

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.AspNetCore.Mvc;

namespace Base.Models
{
    [Table("users")]
    public partial class User
    {
        ...
        [Required]
        [EmailAddress]
        [EmailUserUnique]
        [Column("email", TypeName = "varchar(254)")]
        public string Email { get; set; }
    }
}
        ...

Assim está funcionando, sã não sei se é melhor maneira de resolver este problemma.

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