我正在使用带有EF的ASP.NET MVC 4,我有一个带有索引和创建视图的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);
}
我的_Create局部视图:
@model MyProject.Models.Post
<h2>Create</h2>
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
/**some stuff **/
}
我的索引视图:
@model IEnumerable<MyProject.Models.Post>
@{
ViewBag.Title = "Index";
}
<p>
/** some stuff **/
</p>
@Html.Partial("_Create", **Here I can't declare model**)
我的帖子模型:
public int PostId { get; set; }
public int UserId { get; set; }
public string Content { get; set; }
它告诉我“传入字典的模型项是'System.Collections.Generic.List`1 [MyProject.Models.Post]'类型,但是这个字典需要一个类型为'MyProject.Models的模型项。发布'。
答案 0 :(得分:4)
这实际上取决于您的代码现在的样子。如果您有一个单独的Create
操作方法,则返回PartialView
,如下所示:
[HttpGet]
public ActionResult Create()
{
// Do stuff here to populate your model, if necessary
return PartialView("_Create", model);
}
然后在您的视图中,您可以使用Html.RenderAction()
来显示_Create
部分视图:
<div id="IndexViewStuff">
<p>Some stuff in your normal Index view.</p>
@{Html.RenderAction("Create", "Post");}
</div>
如果您没有Create
的单独操作方法,只是部分视图可以使事情更清晰,那么只需在Html.Partial()
视图中使用Index
即可:
@Html.Partial("_Create") // If your _Create partial does not require a model
@Html.Partial("_Create", Model.CreateViewModel) // If it does require a model
<强>更新强>
查看完代码后,有两种方法可以实现(我会向您展示)。出现问题的原因是,当您的Index
部分视图需要单个_Create
模型时,您会将帖子列表传递到Post
视图。由于您在调用模型时没有明确地将模型传递给局部视图,因此它会自动尝试在Index
视图(您的帖子列表)中使用模型。解决问题的第一种方法是对代码进行最少的更改。
更改Create
操作方法,如下所示:
[HttpGet]
public ActionResult Create()
{
// You have to pass a new Post
return PartialView("_Create", new MyProject.Models.Post());
}
然后在Index
视图中,使用:
@{Html.RenderAction("Create", "Post");}
第二种方法是使用一个视图模型公开要在Index
视图上显示的帖子列表,还有一个“空”Post
模型,可用于创建新的在_Create
局部视图中发布。我更喜欢这种方法,但这是你的呼唤。
您的观看模型:
public class MyViewModel
{
public IEnumerable<Post> Posts { get; set; }
public Post CreatePost { get; set; }
}
您的Index
操作方法:
public ActionResult Index()
{
MyViewModel model = new MyViewModel()
{
Posts = db.Posts.ToList(),
CreatePost = new MyProject.Models.Post()
};
return View(model);
}
您的Index
观点:
@model The.Namespace.MyViewModel
@{
ViewBag.Title = "Index";
}
@foreach (var post in Model.Posts)
{
<p>post.Content</p> // Or however you want to display your posts
}
@Html.Partial("_Create", Model.CreatePost) // Pass the correct model
您的_Create
部分视图将保持不变。