>我在控制器中有如下所示的开机自检操作
[HttpPost]
[ValidateAntiForgeryToken]
[AllowAnonymous]
public async Task<IActionResult> SignIn([ModelBinder(typeof(SignInRequestModelBinder))] SignInRequestModel request, string returnUrl = null)
{
if (!ModelState.IsValid)
{
return View();
}
var result = await _accountService.SignInAsync(request);
if (!string.IsNullOrWhiteSpace(returnUrl))
{
return Redirect(returnUrl);
}
return Json(result);
}
我有一个这样的请求模型
public class SignInRequestModel
{
[Required(ErrorMessage = "Email is required.")]
[EmailAddress]
public string Email { get; set; }
[Required]
[DataType(DataType.Password)]
public string Password { get; set; }
[Display(Name = "Remember Me")]
public bool RememberMe { get; set; }
}
我通过jQuery AJAX将数据发布到模型绑定器 但我可以这样做
var request = bindingContext.ActionContext.HttpContext.Request;
var model = new SignInRequestModel()
{
Email = request.Form["Email"],
Password = request.Form["Password"],
}
这是硬编码的,但我如何以另一种方式做到这一点。当发布数据自定义模型绑定器时,执行此操作而不是编写请求。表单[]...
谢谢你的帮助。
- 在此方案中,无需创建自己的绑定程序。内置模型绑定器已经为您完成了此操作。所以最简单的方法是让 ASP.NET 核心自动绑定模型:
[维基邮报] [验证防伪令牌] [允许匿名] 公共异步任务登录(
(或者如果你使用的是普通控制器(而不是[ModelBinder(typeof(SignInRequestModelBinder((][来自表单]SignInRequestModel 请求,//当您使用ApiController字符串时需要 [FromForm] 返回URL = null ) { ... }ApiController
(,你甚至不必使用[FormForm]
属性(
- 如果您想
自己绑定表单数据,可以使用
Reflection
动态检查所有属性:public Task BindModelAsync(ModelBindingContext bindingContext) { if (bindingContext == null) { throw new ArgumentNullException(nameof(bindingContext)); } var request = bindingContext.ActionContext.HttpContext.Request; var model = new SignInRequestModel(); var pis = typeof(SignInRequestModel).GetProperties(); foreach(var pi in pis){ var pv = bindingContext.ValueProvider.GetValue(pi.Name); // prop value pi.SetValue(model,pv.FirstValue); } bindingContext.Result = ModelBindingResult.Success(model); return Task.CompletedTask; }
这也行得通。但第一种方法是首选,因为这是一种强大的方法。