Asp.net mvc 我的“索引”视图中的“创建”视图是否可能?

Asp.net mvc 我的“索引”视图中的“创建”视图是否可能?,asp.net-mvc,asp.net-mvc-4,razor,Asp.net Mvc,Asp.net Mvc 4,Razor,我正在使用ASP.NETMVC4和EF,我有一个带有索引和创建视图的PostController。我想有两个在同一页上添加一篇文章,并在同一页上可视化它。我怎么做 谢谢你的建议 ___编辑__ 控制器: public ActionResult Index() { return View(db.Posts.ToList()); } [HttpGet] public ActionResult C

我正在使用ASP.NETMVC4和EF,我有一个带有索引和创建视图的PostController。我想有两个在同一页上添加一篇文章,并在同一页上可视化它。我怎么做

谢谢你的建议

___编辑__

控制器:

        public ActionResult Index()
        {
            return View(db.Posts.ToList());
        }

        [HttpGet]
        public ActionResult Create()
        {
            return PartialView("_Create", **Here I can't declare model**);
        }

        [HttpPost]
        public ActionResult Create(FormCollection values)
        {
            var post = new Post();
            TryUpdateModel(post);

            if (ModelState.IsValid)
            {
                /** somme code **/

                db.Posts.Add(post);
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            return View("_Create", post);
        }
My_创建局部视图:

@model MyProject.Models.Post

<h2>Create</h2>

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)

    /**some stuff **/
}

它告诉我传递到字典中的模型项的类型为“System.Collections.Generic.List`1[MyProject.Models.Post]”,但此字典需要类型为“MyProject.Models.Post”的模型项

这实际上取决于您的代码现在的外观。如果有一个单独的Create action方法返回PartialView,如下所示:

[HttpGet]
public ActionResult Create()
{
    // Do stuff here to populate your model, if necessary
    return PartialView("_Create", model);
}
然后在视图中使用Html.RenderAction,您希望在其中显示_createpartial view:

<div id="IndexViewStuff">
    <p>Some stuff in your normal Index view.</p>
    @{Html.RenderAction("Create", "Post");}
</div>
更新

在浏览了代码之后,有两种方法可以做到这一点,我将向你们展示这两种方法。出现问题的原因是,您正在将帖子列表传递给索引视图,而您的_createpartial视图需要一个帖子模型。由于在调用局部视图时没有显式地将模型传递给它,因此它会自动尝试在文章列表的索引视图中使用该模型。解决问题的第一种方法需要对代码进行最小的更改

按如下所示更改创建操作方法:

[HttpGet]
public ActionResult Create()
{
    // You have to pass a new Post
    return PartialView("_Create", new MyProject.Models.Post());
}
然后在索引视图中,使用:

@{Html.RenderAction("Create", "Post");}
第二种方法是使用一个视图模型,该模型公开了要在索引视图上显示的帖子列表,并且还有一个空帖子模型,可用于在_createpartial视图中创建新帖子。我更喜欢这种方法,但这由你决定

您的视图模型:

public class MyViewModel
{
    public IEnumerable<Post> Posts { get; set; }
    public Post CreatePost { get; set; }
}
您的索引视图:


您的_createpartial视图将保持不变。

这实际上取决于您的代码现在的外观。如果有一个单独的Create action方法返回PartialView,如下所示:

[HttpGet]
public ActionResult Create()
{
    // Do stuff here to populate your model, if necessary
    return PartialView("_Create", model);
}
然后在视图中使用Html.RenderAction,您希望在其中显示_createpartial view:

<div id="IndexViewStuff">
    <p>Some stuff in your normal Index view.</p>
    @{Html.RenderAction("Create", "Post");}
</div>
更新

在浏览了代码之后,有两种方法可以做到这一点,我将向你们展示这两种方法。出现问题的原因是,您正在将帖子列表传递给索引视图,而您的_createpartial视图需要一个帖子模型。由于在调用局部视图时没有显式地将模型传递给它,因此它会自动尝试在文章列表的索引视图中使用该模型。解决问题的第一种方法需要对代码进行最小的更改

按如下所示更改创建操作方法:

[HttpGet]
public ActionResult Create()
{
    // You have to pass a new Post
    return PartialView("_Create", new MyProject.Models.Post());
}
然后在索引视图中,使用:

@{Html.RenderAction("Create", "Post");}
第二种方法是使用一个视图模型,该模型公开了要在索引视图上显示的帖子列表,并且还有一个空帖子模型,可用于在_createpartial视图中创建新帖子。我更喜欢这种方法,但这由你决定

您的视图模型:

public class MyViewModel
{
    public IEnumerable<Post> Posts { get; set; }
    public Post CreatePost { get; set; }
}
您的索引视图:


您的_createpartial view将保持不变。

您好,感谢您的解释。我用一些代码更新了我的帖子。我想我需要创建一个ViewModel,就像你说的那样,因为它确实需要一个模型。我不知道如何使用ViewModel,我需要在其中声明什么?我的索引视图使用IEnumerable,而我的_create不使用IEnumerable,如果我理解错误,那就是冲突的地方..我的英语也很抱歉…@另请查看我的更新答案,如果您需要进一步澄清,请告诉我。再次感谢您的精确解释,我现在更好地理解它的工作原理。但是,这两种方法都有一些问题。第一个可行,我的局部视图显示良好,但当我单击“创建”时,它返回给我子操作不允许执行重定向操作。但是我的数据在数据库中写得很好,当我重新执行时会显示出来。第二,我不太理解索引操作方法、viewmodel和create方法之间的联系。。。我已经试过了,我的部分视图显示得很好,但当我单击“创建”时什么也看不到。@对于第一个问题,请尝试使用return RedirectToActionIndex,Post;在HttpPost中创建操作方法。对于第二种方法,您是否使用了与尝试第一种方法时相同的“创建”局部视图?对于第一种方法,即使参数Post也存在相同的问题。是的,我使用的是相同的创建局部视图。您好,谢谢您的解释。我用一些代码更新了我的帖子。我想我需要创建一个ViewModel,就像你说的那样,因为它确实需要一个模型。我不知道如何使用ViewModel,我需要在其中声明什么?我的索引视图使用IEnumerable,而我的_create不使用IEnumerable,如果我理解错误,那就是冲突的地方..我的英语也很抱歉…@另请查看我的更新答案,如果您需要进一步澄清,请告诉我。再次感谢您的精确解释,我现在更好地理解它的工作原理。但是,这两种方法都有一些问题。第一个有效
,我的局部视图显示良好,但当我单击“创建”时,它返回给我子操作不允许执行重定向操作。但是我的数据在数据库中写得很好,当我重新执行时会显示出来。第二,我不太理解索引操作方法、viewmodel和create方法之间的联系。。。我已经试过了,我的部分视图显示得很好,但当我单击“创建”时什么也看不到。@对于第一个问题,请尝试使用return RedirectToActionIndex,Post;在HttpPost中创建操作方法。对于第二种方法,您是否使用了与尝试第一种方法时相同的“创建”局部视图?对于第一种方法,即使参数Post也存在相同的问题。是的,我正在使用相同的创建局部视图。