如何将表单数据传递给 ViewModel 属性?

How to pass form data to ViewModel Properties?

我有一个 .net core 2 代码和一个简单的 UI。
我想将数据从我的表单传递到我的控制器中的操作方法,该方法接受 ViewModel 参数(我必须使用视图模型) 但是当我提交我的表单时,我得到 null 结果。当我使用 User 作为参数类型时,一切正常。这是我的代码。

我的模型

 public class User
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string LastName { get; set; }
        public int Age { get; set; }
    }

我的视图模型

public class UsersViewModel
    {
        public User NewUser { get; set; }
    }

我的行动

[HttpPost]
public IActionResult Index(UsersViewModel user)
  {
      UserDbContext context = new UserDbContext();
      context.Users.Add(user);
      context.SaveChanges();
      return View();
  }

我的看法

@model EFCore2.ViewModels.UsersViewModel


<form asp-controller="Home" asp-action="index" method="post">
    <input name="Name" />
    <input name="LastName" />
    <input name="Age" />
    <br />
    <input type="submit" value="Ok" />
</form>

请帮帮我:(

这样doc:

The Input tag helper generates appropriate name and id attribute values based on the PageModel property that is assigned to it

在您的代码中,您应该为所有输入添加 asp-for。在传递的 viewModel 中,您只有一个 属性 的数据类型为 User 并且无法直接访问 User 属性,因此您应该通过调用 [=16] 来访问它们=] 并且...所以您的视图将如下所示:

@model EFCore2.ViewModels.UsersViewModel


<form asp-controller="Home" asp-action="index" method="post">
    <input asp-for="NewUser.Name" name="Name" />
    <input asp-for="NewUser.LastName"  name="LastName" />
    <input asp-for="NewUser.Age"  name="Age" />
    <br />
    <input type="submit" value="Ok" />
</form>
@model EFCore2.ViewModels.UsersViewModel


<form asp-controller="Home" asp-action="index" method="post">
    <input asp-for="NewUser.Name"/>
    <input asp-for="NewUser.LastName"/>
    <input asp-for="NewUser.Age"/>
    <br />
    <button>submit</button>
</form>

您不一定非要使用 asp-for 方法,但根据我的经验,它确实使它更快一些,因为它可以使用数据注释来创建特定的字段类型,例如电子邮件。

这里重要的是字段上的名称属性需要是Object.Property视图模型

下面的方法也可行,但您会失去一些小好处 asp-因为给了您

<form asp-controller="Home" asp-action="index" method="post">
    <input type="text" name="NewUser.Name"/>
    <input type="text" name="NewUser.LastName"/>
    <input type="number" name="NewUser.Age"/>
    <br />
    <button>submit</button>
</form>