Asp.net mvc 我的“索引”视图中的“创建”视图是否可能?
我正在使用ASP.NETMVC4和EF,我有一个带有索引和创建视图的PostController。我想有两个在同一页上添加一篇文章,并在同一页上可视化它。我怎么做 谢谢你的建议 ___编辑__ 控制器: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
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也存在相同的问题。是的,我正在使用相同的创建局部视图。