添加评论并重定向回博客帖子后,url参数丢失

时间:2012-09-15 16:37:59

标签: asp.net-mvc-3 parameters url-routing

我通过创建博客应用程序来教自己asp .net mvc3。但是,我有 评论上传的问题。这是一个非常微妙的错误,因为当用户发表评论时,一切都有效。但是,帖子的网址会发生变化。

所以,博客文章有一个网址

http://localhost:49175/Blog/Details/3/Third-post

这是由网址映射生成的:

routes.MapRoute(
                "BlogDetail", // Route name
                "Blog/Details/{id}/{urlHeader}", // URL with parameters
                new { controller = "Blog", action = "Details", id = UrlParameter.Optional, urlHeader = UrlParameter.Optional } // Parameter defaults
            );

现在,当用户发表评论时 - 他被定向到评论控制器:

[HttpPost]
    public ActionResult Create(BlogDetailsViewModels viewModel)
    {
        if (ModelState.IsValid)
        {
            try 
            {
                blogrepository.Add(viewModel.Comment);
                return RedirectToAction("Details", "Blog", new { id = viewModel.Comment.BlogID });
            }
            catch (DataException)
            {
                ModelState.AddModelError("", "Unable to save comment. Try again, and if the problem persits then contact administrator.");
            }
        }
        // If we got this far, something failed, redisplay form
        return RedirectToAction("Details", "Blog", new { id = viewModel.Comment.BlogID });
    }
}

然而,当有人发表评论时 - 他被重定向回

http://localhost:49175/Blog/Details/3

我知道,截至目前,RedirectToAction中没有任何内容可以传递urlHeader信息。但是,我尝试过以下几点:

return RedirectToAction("Details", "Blog", new { id = viewModel.Comment.BlogID, urlHeader = viewModel.Blog.UrlHeader });

但是,似乎没有用。

这是博客详细信息控制器:

    //
    // GET: /Blog/Details/5
    public ViewResult Details(int id, string urlHeader)
    {
        var blogs = blogrepository.GetBlog(id);
        var recentblogs = blogrepository.FindRecentBlogs(5);
        var archivelist = blogrepository.ArchiveList();
        BlogDetailsViewModels viewModel = new BlogDetailsViewModels { Blog = blogs, RecentBlogs = recentblogs, ArchiveList = archivelist };
        return View(viewModel);
    }

我被困了几天。

- 所要求的完整路线方法 -

public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "BlogDetail", // Route name
            "Blog/Details/{id}/{urlHeader}", // URL with parameters
            new { controller = "Blog", action = "Details", id = UrlParameter.Optional, urlHeader = UrlParameter.Optional } // Parameter defaults
        );

        routes.MapRoute(
            "BlogArchive", // Route name
            "Blog/{year}/{month}", // URL with parameters
            new { controller = "Blog", action = "Archive" }, // Parameter defaults
            new { year = @"\d{4}", month = @"\d{1,2}", } // Parameter constraints
        );

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );
    }

1 个答案:

答案 0 :(得分:0)

如果您的表单不包含viewModel.Blog.UrlHeader的数据,则它将是一个空字符串,即使viewModel.Blog也可能为null。

您可以在post action方法中添加一个参数,如下所示:

[HttpPost]
public ActionResult Create(BlogDetailsViewModels viewModel, String urlHeader)

并且,在您呈现表单的视图中,使用此代码生成表单元素:

@Html.BeginForm("Create","Blog",new{urlHeader=Model.Blog.UrlHeader})

或者 ,您可以在表单中为urlHeader添加隐藏的输入。这样,您就不必执行前两次更新中的任何一项。

@Html.HiddenFor(m=>m.Blog.UrlHeader)

无论哪种方式,请确保您的Model.Blog.UrlHeader不为null或为空字符串