如何在核心 MVC Asp.Net 执行自定义模型绑定



>我在控制器中有如下所示的开机自检操作

[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"],
}

这是硬编码的,但我如何以另一种方式做到这一点。当发布数据自定义模型绑定器时,执行此操作而不是编写请求。表单[]...

谢谢你的帮助。

  1. 在此方案中,无需创建自己的绑定程序。内置模型绑定器已经为您完成了此操作。所以最简单的方法是让 ASP.NET 核心自动绑定模型:
    [维基邮报] [验证防伪令牌] [允许匿名] 公共异步任务登录([ModelBinder(typeof(SignInRequestModelBinder((][来自表单]SignInRequestModel 请求,//当您使用ApiController字符串时需要 [FromForm] 返回URL = null ) { ... }
    (或者如果你使用的是普通控制器(而不是ApiController(,你甚至不必使用[FormForm]属性(

    如果您想
  1. 自己绑定表单数据,可以使用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;
    }
    

    这也行得通。但第一种方法是首选,因为这是一种强大的方法。

最新更新