2

我正在使用带有 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.Post’类型的模型项。

4

1 回答 1

4

这实际上取决于您的代码现在的外观。如果您有一个单独的Create操作方法返回 a 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局部视图将保持不变。

于 2012-12-13T03:32:04.537 回答