0

我通过创建一个博客应用程序自学asp .net mvc3。但是,我在评论上传时遇到问题。这是一个非常微妙的错误,因为当用户发表评论时一切正常。但是,帖子的网址发生了变化。

所以,一篇博文有一个 url

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

这是由此处的 url 路由映射生成的:

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
        );
    }
4

1 回答 1

0

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

您可以将参数添加到您的 post 操作方法,如下所示:

[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 或空字符串

于 2012-09-16T08:15:53.763 回答