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
。
按照以下步骤操作:
更改操作
[AllowAnonymous]
[HttpPost("register")]
public async Task<IActionResult> RegisterAsync([FromForm]UserRegistrationInfo registrationInfo)
{
return Ok(registrationInfo);
}
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
我已经试过了
我正在使用 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
。
按照以下步骤操作:
更改操作
[AllowAnonymous] [HttpPost("register")] public async Task<IActionResult> RegisterAsync([FromForm]UserRegistrationInfo registrationInfo) { return Ok(registrationInfo); }
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