Пользовательский связыватель модели не запускается для одного свойства в ASP.NET Core 2 - PullRequest
1 голос
/ 13 апреля 2019

Я уже пробовал это , но я не думаю, что это мой случай. Это тоже не работает.

Я использую ASP.NET Core 2 Web API.Я только что создал фиктивный переплет модели (что сейчас не имеет значения):

public class SanitizeModelBinder : IModelBinder
{
    public Task BindModelAsync(ModelBindingContext bindingContext)
    {
        if (bindingContext == null)
        {
            throw new ArgumentNullException(nameof(bindingContext));
        }

        var modelName = bindingContext.ModelName;

        return Task.CompletedTask;
    }
}

Теперь у меня есть модель.Вот этот:

public class UserRegistrationInfo
{
    public string Email { get; set; }

    [ModelBinder(BinderType = typeof(SanitizeModelBinder))]
    public string Password { get; set; }
}

И метод действия:

[AllowAnonymous]
[HttpPost("register")]
public async Task<IActionResult> RegisterAsync([FromBody] UserRegistrationInfo registrationInfo)
{
    var validationResult = validateEmailPassword(registrationInfo.Email, registrationInfo.Password);
    if (validationResult != null) 
    {
        return validationResult;
    }

    var user = await _authenticationService.RegisterAsync(registrationInfo.Email, registrationInfo.Password);

    if (user == null)
    {
        return StatusCode(StatusCodes.Status500InternalServerError, "Couldn't save the user.");
    }
    else
    {
        return Ok(user);
    }
}

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

То, что я пробовал:

Применение атрибута ModelBinder ко всему объекту модели:

[ModelBinder(BinderType = typeof(SanitizeModelBinder))]
public class UserRegistrationInfo
{
    public string Email { get; set; }
    public string Password { get; set; }
}

Это работает,но для всего объекта, и я не хочу этого.Я хочу, чтобы механизм связывания модели по умолчанию выполнял свою работу, а затем применил свой пользовательский механизм связывания модели только к определенным свойствам.

Я прочитал здесь , что это ошибка FromBody, поэтому яудалил его из метода действия.Это также не работает.

Я пытался изменить атрибут ModelBinder для BindProperty здесь:

public class UserRegistrationInfo
{
    public string Email { get; set; }

    [BindProperty(BinderType = typeof(SanitizeModelBinder))]
    public string Password { get; set; }
}

Но это не работает.

Весьма разочаровывает то, что то, что должно быть простым, оказывается довольно громоздким, а информация, разбросанная по нескольким блогам и проблемам GitHub, не помогает вообще.Поэтому, пожалуйста, если вы можете мне помочь, это было бы очень признательно.

1 Ответ

1 голос
/ 15 апреля 2019

Для ModelBinder необходимо использовать application/x-www-form-urlencoded на стороне клиента и [FromForm] на стороне сервера.

Для ApiController привязка по умолчанию - JsonConverter.

Выполните следующие действия:

  1. Изменить действие

    [AllowAnonymous]
    [HttpPost("register")]
    public async Task<IActionResult> RegisterAsync([FromForm]UserRegistrationInfo registrationInfo)
    {
        return Ok(registrationInfo);
    }
    
  2. Угловой

    post(url: string, model: any): Observable <any> {
        let formData: FormData = new FormData(); 
        formData.append('id', model.id); 
        formData.append('applicationName', model.applicationName); 
        return this._http.post(url, formData)
            .map((response: Response) => {
                return response;
            }).catch(this.handleError); 
    }
    

Для использования json с настраиваемым связыванием можно использовать настраиваемые средства форматирования и ссылаться на Настраиваемые средства форматирования в ASP.NET Core Web API

...