将多个值传递到视图中

时间:2012-03-08 22:08:42

标签: asp.net-mvc-3

我有一个观点,我想接受一个帖子和一个评论,这样当我做帖子时,它将同时具有两者并且能够更新两者。

以下是观点:

@model GameDiscussionBazzar.Data.Comment
 @{
    ViewBag.Title = "EditComment";
    Layout = "~/Views/Shared/_EditCommentLayout.cshtml";
}
<div class="EditComment">
<h1>
    Edit Comment
</h1>
@using (Html.BeginForm("EditThreadComment", "Comment"))
{
    <div class="EditingComment">
        @Html.EditorForModel()
        @Html.Hidden("comment", Model)
        @Html.HiddenFor(i => i.ParentThread)
        <input type="submit" value="Save"/>
        @Html.ActionLink("Return without saving", "Index")

    </div>
}
</div>

我有2个方法,一个只是一个动作结果并返回视图,而另一个是返回主页的帖子,如果它成功了。 这是方法:

public ActionResult EditThreadComment(int commentId)
    {
        Comment comment = _repository.Comments.FirstOrDefault(c => c.Id == commentId);

        return View(comment);
    }
    [HttpPost]
    public ActionResult EditThreadComment(Comment comment, Thread thread)
    {
        var c = thread.ChildComments.FirstOrDefault(x => x.Id == comment.Id);
        thread.ChildComments.Remove(c);
        if (ModelState.IsValid)
        {
            _repository.SaveComment(comment);
            thread.ChildComments.Add(comment);
            _tRepo.SaveThread(thread);
            TempData["Message"] = "Your comment has been saved";
            return RedirectToAction("Index", "Thread");
        }
        else
        {
            TempData["Message"] = "Your comment has not been saved";
            return RedirectToAction("Index", "Thread");
        }
    }

所以我的问题又是如何将2个参数传递到视图中?或者我如何传递我的线程的值?

3 个答案:

答案 0 :(得分:4)

为了传回多个值,您应该创建一个ViewModel,它可以保存您希望更改的任何对象和值,并(最终)将其传递回视图。

所以,创建一个这样的新模型......(我现在不在编译器中,所以如果这些代码没有构建,我会道歉。)

public class PostViewModel
{
    public Comment Comment { get; set; }
    public Thread Thread { get; set; }
}

在你的控制器中,你需要基本上在PostViewModel之间来回转换。

public ActionResult EditThreadComment(int commentId)
{
    PostViewModel post = new PostViewModel();

    Comment comment = _repository.Comments.FirstOrDefault(c => c.Id == commentId);
    post.Comment = comment;
    post.Thread = new Thread();

    return View(post);
}

public ActionResult EditThreadComment(PostViewModel post)
{
    Comment comment = post.Comment;
    Thread thread = post.Thread;

    // Now you can do what you need to do as normal with comments and threads
    // per the code in your original post.
}

而且,在您看来,您现在可以将其强烈输入到PostViewModel。所以,在顶部......

@model GameDiscussionBazzar.Data.PostViewModel

你必须更深入一级才能找到单独的Comment和Thread对象。

答案 1 :(得分:1)

您可以创建一个ViewModel类来保存Comment和Thread,然后将该单个视图模型传递给视图,然后该视图可以访问其中的Comment和Thread。

答案 2 :(得分:0)

您可以使用ViewBag.Thread = myThread