【问题标题】:How to pass form data to ViewModel Properties?如何将表单数据传递给 ViewModel 属性?
【发布时间】:2020-05-25 04:15:57
【问题描述】:

我有一个带有简单 UI 的 .net core 2 代码。
我想将表单中的数据传递给控制器​​中的操作方法,该控制器接受 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>

请帮帮我:(

【问题讨论】:

  • NewUser添加到每个标签的name,所以将Name改为NewUser.NameLastName改为NewUser.LastName等。
  • @CodingYoshi 我没有看到你的评论 :)))
  • 是的。有用。坦克战利品

标签: c# html asp.net asp.net-mvc asp.net-core-2.0


【解决方案1】:

就像这个doc

Input 标签助手根据分配给它的 PageModel 属性生成适当的 nameid 属性值

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

@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>

【讨论】:

  • 它到了你的操作方法吗?!
  • 是的。当我调试时,它开始行动。正如我所提到的,当我使用 User 类型而不是 UsersViewModel 时,效果很好。
  • 你的 ViewModel 只有User.. 并且不知道任何关于 'Name'、'LastName' 和 ...
  • @CodingYoshi 我更新了我的答案,它会正常工作
  • Damet garm haji
【解决方案2】:
@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 方法,但根据我的经验,它确实使它更快一点,因为它可以使用数据注释来创建特定的字段类型,例如电子邮件。

这里重要的是,字段上的 Name Attribute 需要为视图模型上的对象的 Object.Property

以下内容也可以使用,但您会失去 asp-for 为您提供的一些小好处

<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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多