Как сделать привязку пользовательской модели в Asp.Net Core MVC - PullRequest
0 голосов
/ 04 октября 2019

У меня есть действие POST в контроллере, как показано ниже

[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 Ответ

0 голосов
/ 07 октября 2019
  1. В этом сценарии вам не нужно создавать свой переплет. Встроенный переплет модели уже сделал это для вас. Таким образом, самый простой способ - дать ASP.NET Core связать модель автоматически :
    [HttpPost]
    [ValidateAntiForgeryToken]
    [AllowAnonymous]
    public async Task SignIn(
        <strike>[ModelBinder(typeof(SignInRequestModelBinder))]</strike> 
        <b>[FromForm]</b>SignInRequestModel request,  // the [FromForm] is required when you're using an <b>ApiController</b>
        string returnUrl = 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;
}

Это также работает. Но первый способ предпочтительнее, потому что это надежный путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...