Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从部分视图中的表单发布-为什么它会触发错误的控制器操作?_C#_Html_Asp.net Mvc_Post_Razor - Fatal编程技术网

C# 从部分视图中的表单发布-为什么它会触发错误的控制器操作?

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表单帮助程序

请耐心听我描述这个问题

使用局部视图的MVC3应用程序。无法从其父模型的详细信息视图在局部视图中发布注释表单

参考
ArticleViewModel
有一个
CommentsViewModel
集合,因此存在OTM关系

详细信息视图 _注释编辑器局部视图 情景/问题
  • Http请求
    /Article/Details/{slug}
    正确呈现文章、评论和编辑器表单

  • 编辑器按预期工作,但单击Submit时,我注意到正在调用控制器上的Details操作,而不是HttpPost注释操作

  • 如您所见,Razor表单帮助程序使用
    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 all
    article/{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" });