自定义模型绑定器不会针对核心 2 中的单个属性触发 ASP.NET



我已经尝试过了,但我认为不是我的情况。这也行不通。

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

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

我在这里读到这是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. 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与自定义绑定配合使用,可以自定义格式化程序,并在核心 Web API 中引用自定义格式化程序 ASP.NET 并引用

相关内容

  • 没有找到相关文章

最新更新