从局部视图返回响应的最佳实践

时间:2009-12-09 19:36:09

标签: asp.net-mvc partial-views

我正在用ASP.NET MVC编写一个简单的博客平台。我的问题是关于部分视图中包含的表单以及从控制器处理响应,验证错误或成功。

我有一个博客文章项目视图,其中有一个关联的控制器,它返回给定URL的帖子。此视图中嵌入了一个局部视图,其中包含用于在帖子上提交评论的表单。部分视图表单提交给处理添加注释的单独控制器。在添加注释操作中,我执行验证并向ModelState对象添加错误。

问题是我必须在部分视图操作上返回RedirectResult,以便用户返回到原始post项,这意味着我丢失了ModelState对象或我想要返回的任何成功消息。

我看到人们提到使用TempData将验证或成功信息传递回原始视图,但对我来说这听起来有些过时。这真的是解决方案吗?如果是这样,任何人都可以推荐一个很好的例子吗?如果没有,这是否是我选择的架构中更大问题的迹象?

3 个答案:

答案 0 :(得分:3)

我过去曾尝试使用PRG模式试一试

Use PRG Pattern for Data Modification

答案 1 :(得分:1)

您可以让添加评论操作调用视图发布操作...

我猜是这样的事情:

public class PostController
{
    ... blah ...

    public ActionResult ViewPost(int postId)
    {
        Post post = PostRepository.GetPost(postId);
        return View("ViewPost", post);
    }

    public ActionResult AddComment(int postId, string comment, string otherInfo)
    {
        //Validate stuff, setting modelstate etc

        //If it isn't valid, return the same post view (modelstate will stay)
        if (!ModelState.IsValid)
            return this.ViewPost(postId);

        //If it is valid then we want to save it and follow PRG pattern
        PostRepository.Save(newValidComment);
        TempData["Message"] = "Thanks for your comment!";
        return RedirectToAction("ViewPost", new {id = postId});
    }
}

或同一概念的变体......

HTHS,
查尔斯

答案 2 :(得分:0)

您是否考虑过使用Ajax库发布该页面的区域?这样你就不需要重定向了。