以下是我整个网站中不同操作和视图的一些奇怪行为:
每当我发布一些动作方法并且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,爆炸,异常。每一次。
答案 0 :(得分:9)
从子操作中删除[HttpGet]属性!
问题是Html.Action()似乎总是遇到异常而不是在GET之后,返回View(),而是POST,返回View()。
年龄之前,我浏览了整个网站并标记了所有不具有[HttpGet]属性的帖子的操作方法。我没有意识到这会导致问题。一直在测试!
从Html.Action()调用的动作方法中删除[HttpGet]属性解决了这个问题。