C# 从部分视图中的表单发布-为什么它会触发错误的控制器操作?
请耐心听我描述这个问题 使用局部视图的MVC3应用程序。无法从其父模型的详细信息视图在局部视图中发布注释表单 参考C# 从部分视图中的表单发布-为什么它会触发错误的控制器操作?,c#,html,asp.net-mvc,post,razor,C#,Html,Asp.net Mvc,Post,Razor,请耐心听我描述这个问题 使用局部视图的MVC3应用程序。无法从其父模型的详细信息视图在局部视图中发布注释表单 参考ArticleViewModel有一个CommentsViewModel集合,因此存在OTM关系 详细信息视图 _注释编辑器局部视图 情景/问题 Http请求/Article/Details/{slug}正确呈现文章、评论和编辑器表单 编辑器按预期工作,但单击Submit时,我注意到正在调用控制器上的Details操作,而不是HttpPost注释操作 如您所见,Razor表单帮助程序
ArticleViewModel
有一个CommentsViewModel
集合,因此存在OTM关系
详细信息视图
_注释编辑器局部视图
情景/问题
/Article/Details/{slug}
正确呈现文章、评论和编辑器表单POST
在文章
控制器上指定注释
操作
问题:
为什么会这样?我错过了什么?笨蛋奖
答案是路由。
仔细看Fiddler,我实际上是在向/article/comment
发送一个POST
请求,所以我检查了我的路由。。。我怎么会错过这个,我不知道:
routes.MapRoute("Article-Create", "article/create", new { controller = "Article", action = "Create" });
routes.MapRoute("Article-Edit", "article/edit/{slug}", new { controller = "Article", action = "Edit" });
routes.MapRoute("Article-Delete", "article/delete/{slug}", new { controller = "Article", action = "Delete" });
routes.MapRoute("Article", "article/{slug}", new { controller = "Article", action = "Details" });
routes.MapRoute("Articles", "articles", new { controller = "Article", action = "Index" });
注释操作没有明确的路由。有一个获取文章的catch-all-REST-ish路由(article/{slug}
)。因此,在点击默认路径之前,评论帖子由它处理
我的具体解决方案(我喜欢显式路由——即使这会给我带来麻烦)是为注释添加一条路由,这与catch allarticle/{slug}
模式差不多:
routes.MapRoute("Article-Comment", "article/comment", new { controller = "Article", action = "Comment" });
问题解决了。尴尬
public ActionResult Details(string slug) {
return View(_articleService.Get(slug));
}
[HttpPost]
public ActionResult Comment(string slug, CommentViewModel comment) {
if(ModelState.IsValid) {
_articleService.AddComment(comment, slug);
}
return RedirectToAction("Details", new { Slug = slug });
}
routes.MapRoute("Article-Create", "article/create", new { controller = "Article", action = "Create" });
routes.MapRoute("Article-Edit", "article/edit/{slug}", new { controller = "Article", action = "Edit" });
routes.MapRoute("Article-Delete", "article/delete/{slug}", new { controller = "Article", action = "Delete" });
routes.MapRoute("Article", "article/{slug}", new { controller = "Article", action = "Details" });
routes.MapRoute("Articles", "articles", new { controller = "Article", action = "Index" });
routes.MapRoute("Article-Comment", "article/comment", new { controller = "Article", action = "Comment" });