如何将表单数据传递给 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>
我有一个 .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
andid
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>