我已经尝试过了,但我认为不是我的情况。这也行不通。
我正在使用 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
。
请按照以下步骤操作:
-
更改操作
[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
与自定义绑定配合使用,可以自定义格式化程序,并在核心 Web API 中引用自定义格式化程序 ASP.NET 并引用