Как сделать свойство обязательным для POST, но не для запросов PUT - PullRequest
0 голосов
/ 01 мая 2018

Допустим, у меня есть модель User, которая имеет свойства Email и Password для целей аутентификации, а именно:

public class User
{
    public long Id { get; set; }
    [Required]
    public string FirstName { get; set; }
    [Required]
    public string LastName { get; set; }

    [Required]
    [EmailAddress]
    public string Email { get; set; }

    [Required]
    [DataType(DataType.Password)]
    public string Password { get; set; }
}

Моя цель - сделать эти свойства обязательными только для запросов POST, но не для PUT. То есть: поля Email и Password обязательны для создания нового пользователя. Но при редактировании я могу опустить эти свойства. Я знаю, что эту цель можно заархивировать, удалив [Required] из электронной почты и пароля и проверив эти свойства при размещении почты, но это не очень хорошая практика.

Итак, есть более элегантное решение для этого варианта использования?

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

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

public class User
{
    public long Id { get; set; }
    [Required]
    public string FirstName { get; set; }
    [Required]
    public string LastName { get; set; }

    [Required]
    [EmailAddress]
    public string Email { get; set; }

    [Required]
    [DataType(DataType.Password)]
    public string Password { get; set; }
}

// When creating, the client cannot know the Id because it doesn't exist
public class CreateUserViewModel
{
    [Required]
    public string FirstName { get; set; }
    [Required]
    public string LastName { get; set; }

    [Required]
    [EmailAddress]
    public string Email { get; set; }

    [Required]
    [DataType(DataType.Password)]
    public string Password { get; set; }
}

// and when updating, the Id is required but not the Email nor the Password
public class UpdateUserViewModel
{
    [Required]
    public long Id { get; set; } 

    [Required]
    public string FirstName { get; set; }
    [Required]
    public string LastName { get; set; }
}

Конечно, поскольку вы создаете API, "View Model" может не иметь большого смысла. Вместо этого вы можете использовать термин Data Transfer Object (DTO).

0 голосов
/ 01 мая 2018

Одним из предложений будет использование View Models. В вашем случае у вас может быть RegisterViewModel, который принимает все значения из модели, а затем у вас может быть EditViewModel, который не включает электронную почту и пароль. В вашем контроллере функция редактирования может либо заменить старые значения для другого поля, либо просто игнорировать их.

https://www.codeproject.com/Articles/1174826/Using-MVVM-in-MVC-Applications-Part

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