【问题标题】:Multiple controller types were found that match the URL in mvc app发现多个控制器类型与 mvc 应用程序中的 URL 匹配
【发布时间】:2019-05-12 11:48:03
【问题描述】:

我在以下两个控制器中使用属性路由时遇到了一个奇怪的错误:

[Route("{action=Index}")]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }
}

[RoutePrefix("search")]
[Route("{action=Index}")]
public class SearchController : Controller
{
    public ActionResult Index(string searchTerm)
    {
        return View();
    }
}

在路由配置中:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapMvcAttributeRoutes();

如你所见,第二个控制器应该有一个搜索前缀

但是,如果我去 dev.local/search?searchterm=test

我得到了错误

请求找到了以下匹配的控制器类型: Marshalls.WebComponents.Web.Controllers.SearchController Marshalls.WebComponents.Web.Controllers.HomeController

如果我从主控制器中删除[Route("{action=Index}")],它会正常工作,但是我无法使用http://dev.local/ 访问主页

这种情况以前没有发生过,通常工作正常,所以我想知道是否有人能发现我搞砸的任何明显的事情

【问题讨论】:

    标签: c# asp.net-mvc routes attributerouting


    【解决方案1】:

    为 HomeController 添加 RoutePrefix 并将 Route 从控制器移动到方法/操作。

    Route 和 RoutePrefix 属性中的空字符串表示此控制器或操作是默认的。

    http://dev.local/ => HomeController 和索引操作

    http://dev.local/search?searchTerm=123 => SearchController 和索引操作

    请记住,只有一个控制器可以有空的RoutePrefix,并且控制器中只有一个动作可以有空的Route

    [RoutePrefix("")]
    public class HomeController : Controller
    {
        [Route("")]
        public ActionResult Index()
        {
            return View();
        }
    }
    
    [RoutePrefix("search")]
    public class SearchController : Controller
    {
        [Route("")]
        public ActionResult Index(string searchTerm)
        {
            return View();
        }
    }
    

    【讨论】:

    • 这可行,但我仍然不明白为什么我的版本不会 - 即一个控制器有一个搜索的路由前缀,另一个是空的,那么这怎么会导致 mvc 找到相同的 url两个控制器?似乎在实际索引上使用[Route("")] 而不是在控制器上使用[Route("{action=Index}")] 的行为似乎是问题所在
    • @Pete 您的代码的问题是您没有为 HomeController 定义 RoutePrefix。如果您决定使用 RoutePrefix,则应该在任何地方使用它。您可以通过添加 [RoutePrefix("home")] 并在路由配置中定义默认路由来修复它。
    猜你喜欢
    • 2016-07-27
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    • 2018-07-22
    • 1970-01-01
    • 2017-09-20
    • 2023-04-06
    • 2014-05-19
    相关资源
    最近更新 更多