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

时间:2019-04-13 19:52:25

标签: asp.net asp.net-core asp.net-core-2.0 asp.net-core-webapi custom-model-binder

我已经尝试过this,但是我不认为这是我的情况。 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);
    }
}

如果我从客户端发出发布请求,则不会触发我的自定义模型活页夹,并且继续以action方法执行。

我尝试过的事情:

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

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

这可行,但是对于整个对象,我不想要那样。我希望默认模型联编程序完成其工作,然后将我的自定义模型联编程序仅应用于某些属性。

我读到hereFromBody的错,所以我从操作方法中删除了它。也不行。

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

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

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

但这不起作用。

令人非常失望的是,应该变得简单的事情变得非常繁琐,分散在多个博客和github问题上的信息根本没有帮助。因此,请您帮我,我们将不胜感激。

1 个答案:

答案 0 :(得分:1)

对于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和自定义绑定,可以自定义格式化程序,并参考Custom formatters in ASP.NET Core Web API