Asp.net core mvc 为什么将表单控件传递给ViewModel在ASP.NET Core 2.0中不起作用?

Asp.net core mvc 为什么将表单控件传递给ViewModel在ASP.NET Core 2.0中不起作用?,asp.net-core-mvc,asp.net-identity,asp.net-core-2.0,Asp.net Core Mvc,Asp.net Identity,Asp.net Core 2.0,我构建了一个简单的ASP.NETCore2.0应用程序,并且有一个简单的登录视图。我正在使用ASP.NET核心标识,这意味着我正在使用“IdentityUser”类 当用户点击表单上的“登录”时,我的ASP.NET标记帮助程序指示post请求将点击“帐户”控制器中的“登录”操作 这是我的“登录”操作 private readonly SignInManager<IdentityUser> _signInManager; private readonly

我构建了一个简单的ASP.NETCore2.0应用程序,并且有一个简单的登录视图。我正在使用ASP.NET核心标识,这意味着我正在使用“IdentityUser”类

当用户点击表单上的“登录”时,我的ASP.NET标记帮助程序指示post请求将点击“帐户”控制器中的“登录”操作

这是我的“登录”操作

        private readonly SignInManager<IdentityUser> _signInManager;
        private readonly UserManager<IdentityUser> _userManager;

        public AccountController(SignInManager<IdentityUser> signInManager, UserManager<IdentityUser> userManager)
        {
            _signInManager = signInManager;
            _userManager = userManager;
        }

        [HttpGet]
        public IActionResult Login()
        {
            return View(new LoginViewModel());
        }

        [HttpPost]
        public async Task<IActionResult> Login(LoginViewModel loginViewModel)
        {
            if (!ModelState.IsValid)
            {
                return View(loginViewModel);
            }


            var user = await _userManager.FindByNameAsync(loginViewModel.UserName);

            if (user != null)
            {
                var result = await _signInManager.PasswordSignInAsync(user, loginViewModel.Password, false, false);
                if (result.Succeeded)
                {
                    return RedirectToAction("Index", "Home");
                }
            }

            ModelState.AddModelError("", "User name/password not found");
            return View(loginViewModel);
        }
private readonly-SignInManager\u-SignInManager;
私有只读用户管理器_UserManager;
公共帐户控制器(SignInManager SignInManager、UserManager UserManager)
{
_signInManager=signInManager;
_userManager=userManager;
}
[HttpGet]
公共IActionResult登录()
{
返回视图(新的LoginViewModel());
}
[HttpPost]
公共异步任务登录(LoginViewModel LoginViewModel)
{
如果(!ModelState.IsValid)
{
返回视图(loginViewModel);
}
var user=await\u userManager.FindByNameAsync(loginViewModel.UserName);
如果(用户!=null)
{
var result=await _signInManager.PasswordSignInAsync(user,loginViewModel.Password,false,false);
if(result.successed)
{
返回重定向到操作(“索引”、“主页”);
}
}
AddModelError(“,“未找到用户名/密码”);
返回视图(loginViewModel);
}
我传递给“Login”操作的对象“loginViewModel”为null,这意味着它在用户提交表单时没有获取表单数据


你知道我在这里遗漏了什么吗,很确定这是件愚蠢的事情吗?

你遗漏了输入上的标记帮助程序

<div class="form-group">
    <label asp-for="UserName">User Name</label>
    <input type="text" class="form-control" placeholder="Username"
        asp-for="UserName" />    <!-- You're missing this -->
    <span asp-validation-for="UserName" class="text-danger"></span>
</div>
  • 如果需要,您也可以使用
    HTML帮助程序
    [Display]
    生成占位符文本。这样,您就不需要对视图上的文本进行硬编码

    <div class="form-group">
        <label asp-for="UserName"></label>
        <input type="text" class="form-control" asp-for="UserName"
            placeholder="@Html.DisplayNameFor(x => x.UserName)" />
    </div>
    
    
    

  • 输入上缺少标记帮助程序

    <div class="form-group">
        <label asp-for="UserName">User Name</label>
        <input type="text" class="form-control" placeholder="Username"
            asp-for="UserName" />    <!-- You're missing this -->
        <span asp-validation-for="UserName" class="text-danger"></span>
    </div>
    
  • 如果需要,您也可以使用
    HTML帮助程序
    [Display]
    生成占位符文本。这样,您就不需要对视图上的文本进行硬编码

    <div class="form-group">
        <label asp-for="UserName"></label>
        <input type="text" class="form-control" asp-for="UserName"
            placeholder="@Html.DisplayNameFor(x => x.UserName)" />
    </div>
    
    
    

  • 您正在为您的输入生成手动html,它们没有
    名称
    属性,因此在提交表单时不会发布值

    更改输入以使用TagHelpers,它将生成正确的html,包括用于客户端验证的
    name
    属性和
    data val-*
    属性

    //
    // 
    
    您正在为输入生成手动html,它们没有
    名称
    属性,因此在提交表单时不会发布值

    更改输入以使用TagHelpers,它将生成正确的html,包括用于客户端验证的
    name
    属性和
    data val-*
    属性

    //
    // 
    
    输入没有与模型成员匹配的名称。@Nkosi我使用的是ASP.NET标记帮助程序,例如ASP for=“UserName”表示表单数据将被注入映射此字段的模型。输入没有与模型成员匹配的名称。@Nkosi我使用的是ASP.NET标记帮助程序,例如,asp for=“UserName”表示表单数据将被注入到映射此字段的模型中。谢谢您的详细回答。事实上,这是一个愚蠢的错误,我已经知道了解决办法。另外,感谢您为我解释帮助标签,并为您提供详细的答案。事实上,这是一个愚蠢的错误,我已经知道了解决办法。另外,谢谢你为我解释助手标签
    <label asp-for="UserName"></label>
    
    <div class="form-group">
        <label asp-for="UserName"></label>
        <input type="text" class="form-control" asp-for="UserName"
            placeholder="@Html.DisplayNameFor(x => x.UserName)" />
    </div>