ASP.NET Core 2 中的单个 属性 自定义模型活页夹未触发

Custom model binder not firing for a single property in ASP.NET Core 2

我已经试过了, but I don't think it's my case. This也不行。

我正在使用 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);
    }
}

如果我从客户端发出 post 请求,我的自定义模型联编程序不会被触发,并且会在操作方法中继续执行。

我尝试过的东西:

ModelBinder 属性应用于整个模型对象:

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

这可行,但适用于整个对象,我不希望这样。我希望默认模型绑定器完成其工作,然后仅将我的自定义模型绑定器应用于某些属性。

我读到 here 这是 FromBody 的错误,所以我将其从操作方法中删除。也不行。

我试图在此处更改 BindProperty 的属性 ModelBinder

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

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

但是没用。

令人失望的是,一些应该简单的事情变得非常繁琐,分散在几个博客和 github 问题上的信息根本没有帮助。所以,如果你能帮助我,我将不胜感激。

对于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. Angular

    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 与自定义绑定一起使用,您可以自定义格式化程序,并参考 Custom formatters in ASP.NET Core Web API