【问题标题】:Asp.Net MVC5 - Html.Action - Attribute Routing - Weird Behaviour causing ExceptionsAsp.Net MVC5 - Html.Action - 属性路由 - 导致异常的奇怪行为
【发布时间】: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


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多