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

时间:2012-12-13 02:25:54

标签: asp.net-mvc asp.net-mvc-4 razor

我正在使用带有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的模型项。发布'。

1 个答案:

答案 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部分视图将保持不变。