【发布时间】:2016-01-18 15:21:58
【问题描述】:
以下是我整个网站的不同操作和视图中一致的一些奇怪行为:
每当我发布到某个操作方法并且 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 操作方法 return View() 中第一次工作,Html.Action 总是在 POST return View() 之后抛出这个异常。这是我网站的一般模式。
什么?任何想法这里出了什么问题?我唯一能想到的是我随着时间的推移添加了更多路线,现在它很困惑。如果是这种情况,我将如何解决或测试?
我突然想到,我有许多路由/操作方法,其中操作方法的 get 和 post 版本的路由是相同的,除了操作方法上的 GET 或 POST 属性。我之前确保每条路线都是完全独特的,因为我得到了一些歧义,但是将它改回了 get 和 post 操作方法的相同路线,唯一的区别是 get 或 post 属性......我开始确信它是一个路由问题,但我不知道具体出了什么问题。我有数百个动作方法的路由属性。
我以前从未见过如此微妙的事情,甚至不知道如何开始解决这样的事情。我不知道它是简单还是复杂,是我的代码还是框架。任何帮助将不胜感激。
更新:
一些示例代码,不确定它是否会有所帮助,因为在许多完全不同的操作方法和视图中都会发生相同的事情,无论 GET、POST、授权、未授权、是否在某个角色中、antiforgerytoken...
从视图调用的标准 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,砰,异常。每次。
【问题讨论】:
-
需要出示相关代码
-
查看我的更新,了解一般模式。这段代码正是我为特定动作/视图所拥有的,但只要代码遇到返回 View(),并且该视图包含 Html.Action(),砰,异常。你还有什么想看的吗?
-
您的路由设置也可能有帮助
-
你的
@Html.Action()使用"CategoryDropDowns"这是方法的名称,但你的路由是"category-drop-downs"? -
很抱歉我太密集了,但这是个问题吗?这些操作方法仅由视图调用,除非您使用开发人员工具或提琴手或其他东西,否则您看不到 URL。我认为问题在于我的网站中有数百个属性路由,并且框架的属性路由部分发生了故障,我不知道是什么。我应该重申,浏览该网站,Html.Action()s 工作正常。如果我出于任何原因返回 View(),则异常。我能想到的就是去掉属性路由。救命!
标签: asp.net asp.net-mvc asp.net-mvc-5 asp.net-mvc-routing attributerouting