在mvc应用程序中找到与URL匹配的多种控制器类型

时间:2018-12-11 13:15:05

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

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

[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/进入主页

这种情况以前从未发生过,通常可以正常运行,所以我想知道是否有人可以发现我弄乱了任何明显的东西

1 个答案:

答案 0 :(得分:3)

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

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

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

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

请记住,只有一个控制器可以具有空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();
    }
}