Asp.Net MVC5 - Html.Action - 属性路由 - 导致异常的奇怪行为

时间:2015-10-20 05:26:44

标签: asp.net asp.net-mvc asp.net-mvc-5 asp.net-mvc-routing attributerouting

以下是我整个网站中不同操作和视图的一些奇怪行为:

每当我发布一些动作方法并且Model.IsValid为false时,我都会返回视图。每当返回的视图中调用Html.Action()时,我都会遇到以下异常:

(System.Web.HttpException): No matching action was found on controller 'xyz'. 

This can happen when a controller uses RouteAttribute for routing, 
but no action on that controller matches the request.

我正在使用属性路由。

public class RouteConfig
{
    // REGISTER ROUTES

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.MapMvcAttributeRoutes();        
    }     
}

所以即使Html.Action调用第一次在GET操作方法中返回View(),Html.Action总是在POST返回View()之后抛出此异常。这是我网站上的一般模式。

跆拳道?有什么想法在这里出了什么问题?我唯一能想到的是我随着时间的推移添加了更多的路线,现在它很困惑。如果是这样的话,我该如何修复或测试?

我刚想到我有很多路由/动作方法,其中动作方法的路径的get和post版本是相同的,除了action方法的GET或POST属性。我以前确定每条路线都是完全独特的,因为我得到了一些歧义,但是将其改回了相同的路线,用于获取和后置动作方法,唯一的区别是get或post属性......我变得确信它是路由问题,但我不知道具体是什么问题。我有数百种动作方法的路由属性。

我以前从未见过如此微妙的东西,甚至不知道如何开始解决这样的问题。我不知道它是简单还是复杂,如果它是我的代码或框架。任何帮助将不胜感激。

更新:

一些示例代码,不确定它会有所帮助,因为相同的事情发生在许多完全不同的动作方法和视图中,无论GET,POST,授权,未授权,角色与否,反伪造......

从视图调用标准Html.Action。大多数时候工作正常。 (不同的重载没有区别。)

@Html.Action("CategoryDropDowns", "Category")

以下是被调用的内容(确切地说返回的内容没有区别,可能是ViewResult,可能是一个int)。

// GET: /category/category-drop-downs   
[HttpGet]
[Route("category/category-drop-downs")]           
public ViewResult CategoryDropDowns()
{

}

如果验证失败,则返回视图:

public ActionResult CreateListing(ListDetails listDetails)
{                                       
    if (ModelState.IsValid)
    {
    }
    else
    {
        return View("List", model);
    }
}

在通过返回的视图进行调试时,第一次正常工作的Html.Action调用会抛出异常。同样的事情发生在我的网站上的模式。返回View(),点击Html.Action,爆炸,异常。每一次。

1 个答案:

答案 0 :(得分:9)

从子操作中删除[HttpGet]属性!

问题是Html.Action()似乎总是遇到异常而不是在GET之后,返回View(),而是POST,返回View()。

年龄之前,我浏览了整个网站并标记了所有不具有[HttpGet]属性的帖子的操作方法。我没有意识到这会导致问题。一直在测试!

从Html.Action()调用的动作方法中删除[HttpGet]属性解决了这个问题。