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] 属性已解决问题。
这里有一些奇怪的行为,在我整个网站的不同操作和视图中都是一致的:
每当我 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] 属性已解决问题。