我应该如何发送viewmodel到Controller中的Create方法?

时间:2019-02-09 18:24:02

标签: asp.net model-view-controller viewmodel

我正在尝试将数据从视图发送到控制器的Create方法。但是,当调用create方法时,视图模型参数将获得空值。

在我看来,我想添加一个项目并显示已添加项目的列表。 我试图将数据发送到create方法,但是其视图模型参数正在获取空值。

在下面的代码中,只要单击Create方法,则p.posts的值和p.post为null。我如何在这里获得p.post和p.posts的价值?

控制器方法

public ActionResult Create(PostsViewModel p) {}

查看模型

public class PostsViewModel
{
    public IEnumerable<Post> posts;
    public Post post;

}

查看

@model NotesWebApplication.ViewModels.PostsViewModel

...

@using (Html.BeginForm())  {

...

@Html.EditorFor(model => model.post.postText, new { htmlAttributes = new { @class = "form-control" } })

...

<input type="submit" value="Create" class="btn btn-default" />

如果要添加Bind,则还应在我的Create方法中添加

[Bind(Include="postText")]

[Bind(Include="post.postText")]

更新

我在PostsViewModel类中进行了以下更改

public class PostsViewModel
    {
        public IEnumerable<Post> posts { get; set; }
        public Post post { get; set; }

    }

,控制器中的Create方法更改为

[HttpPost]
  public ActionResult Create([Bind(Include="post, posts")]PostsViewModel p) {}

这是httpget Create方法的样子

// GET: Posts/Create
        public ActionResult Create()
        {
            PostsViewModel postsViewModel = new PostsViewModel();
            postsViewModel.posts = db.Posts;
            postsViewModel.post = new Post();
            return View(postsViewModel);
        }

现在,当我在控制器参数中提交表单p.post时,它会收到所需的值。但是p.posts仍然为空。为什么会发生这种情况?

1 个答案:

答案 0 :(得分:0)

我想原因是您没有post对象的实例。尝试使您的viewModel像这样:

public class PostsViewModel
{
    public string PostText {get;set;} // don`t forget to make it like property, not just a field
}

,然后在您的控制器中创建一个实例:

public ActionResult Create(PostsViewModel p) 
{
   Post post = new Post{ postText = p.PostText};
   //and do what you want with it
}