我已经尝试过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; }
}
这可行,但是对于整个对象,我不想要那样。我希望默认模型联编程序完成其工作,然后将我的自定义模型联编程序仅应用于某些属性。
我读到here是FromBody
的错,所以我从操作方法中删除了它。也不行。
我试图在此处为ModelBinder
更改属性BindProperty
:
public class UserRegistrationInfo
{
public string Email { get; set; }
[BindProperty(BinderType = typeof(SanitizeModelBinder))]
public string Password { get; set; }
}
但这不起作用。
令人非常失望的是,应该变得简单的事情变得非常繁琐,分散在多个博客和github问题上的信息根本没有帮助。因此,请您帮我,我们将不胜感激。
答案 0 :(得分:1)
对于ModelBinder
,您需要在客户端使用application/x-www-form-urlencoded
,在服务器端使用[FromForm]
。
对于ApiController
,其默认绑定为JsonConverter
。
请按照以下步骤操作:
更改操作
[AllowAnonymous]
[HttpPost("register")]
public async Task<IActionResult> RegisterAsync([FromForm]UserRegistrationInfo registrationInfo)
{
return Ok(registrationInfo);
}
角度
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