我通过创建博客应用程序来教自己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
);
}
答案 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或为空字符串