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

Asp.Net MVC5 - Html.Action - Attribute Routing - Weird Behaviour causing Exceptions

这里有一些奇怪的行为,在我整个网站的不同操作和视图中都是一致的:

每当我 POST 某些操作方法并且 Model.IsValid 为假时,我 return 视图。每当在 returned 的视图中调用 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 操作方法 return View() 中工作,Html.Action 总是在 POST return 查看()。这是我网站上的一般模式。

卧槽?知道这里出了什么问题吗?我唯一能想到的是随着时间的推移我添加了更多的路线,现在它很困惑。如果是这种情况,我将如何修复或测试它?

我刚刚想到我有很多 routes/action 方法,其中动作方法的 get 和 post 版本的路由是相同的,除了 GET 或 POST 属性动作方法。我之前确保每条路线都是完全独特的,因为我有点模棱两可,但将其改回相同的路线 get 和 post 操作方法,唯一的区别是 get 或 post 属性......我越来越相信这是一个路由问题,但我不知道具体出了什么问题。我在数百个操作方法上都有路由属性。

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

更新:

一些示例代码,不确定它是否有帮助,因为相同的事情作为模式发生在许多完全不同的操作方法和视图中,无论 GET、POST、授权、未授权、角色或不,防伪令牌...

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

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

这是被调用的内容(被 returned 调用的内容没有区别,可以是 ViewResult,也可以是 int)。

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

}

如果验证失败,视图是 returned:

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

并且在通过获得 returned 的视图进行调试时,对 Html.Action 的调用在第一次运行良好时抛出了异常。同样的事情发生在我的网站上。 Return View(),命中 Html.Action,砰,异常。每一次。

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

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

很久以前,我浏览了我的整个站点,并用 [HttpGet] 属性标记了每个不是 post 的操作方法。我没有意识到这会导致问题。总是测试!

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