MVC 5 属性路由:从控制器操作中删除不必要的路由属性
MVC 5 Attribute Routing: Removing Unnecessary Route Attribute From Controller Actions
我有一个要求,即无需在 URL 中输入控制器名称即可访问家庭控制器上的资源。例如,当我导航到 mysite.com/
时应该加载 index
操作,并且应该使用 mysite.com/contact
加载联系人页面等等。
下面的控制器满足这个要求,但我想知道是否有办法删除与控制器动作同名的 Route 属性?
例如,使用[Route("contact")]
作为动作联系是没有意义的。当我删除此路由属性时,URL 生成为 mysite.com/home/contact
而我希望它是 mysite.com/contact
.
[RoutePrefix("")] // Remove the name of the controller from the URL
public class HomeController : Controller
{
public ViewResult Index()
{
return View("Index");
}
[Route("contact")]
public ViewResult Contact()
{
return View("Contact");
}
[Route("about")]
public ViewResult About()
{
return View("About");
}
[Route("terms-and-conditions")]
public ViewResult TermsAndConditions()
{
return View("TermsAndConditions");
}
}
仅供参考,这是我的路线配置:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapMvcAttributeRoutes();
routes.LowercaseUrls = true;
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
和 Application_Start 事件:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
我没有使用空值作为路由前缀,而是在特定的控制器操作上使用了路由属性,如下所示:
public class HomeController : Controller
{
public ViewResult Index()
{
return View("Index");
}
[Route("contact-us")]
public ViewResult Contact()
{
return View("Contact");
}
[Route("about-us")]
public ViewResult About()
{
return View("About");
}
[Route("terms-and-conditions")]
public ViewResult TermsAndConditions()
{
return View("TermsAndConditions");
}
}
这可确保从站点的根目录访问每个定义的路由。
我有一个要求,即无需在 URL 中输入控制器名称即可访问家庭控制器上的资源。例如,当我导航到 mysite.com/
时应该加载 index
操作,并且应该使用 mysite.com/contact
加载联系人页面等等。
下面的控制器满足这个要求,但我想知道是否有办法删除与控制器动作同名的 Route 属性?
例如,使用[Route("contact")]
作为动作联系是没有意义的。当我删除此路由属性时,URL 生成为 mysite.com/home/contact
而我希望它是 mysite.com/contact
.
[RoutePrefix("")] // Remove the name of the controller from the URL
public class HomeController : Controller
{
public ViewResult Index()
{
return View("Index");
}
[Route("contact")]
public ViewResult Contact()
{
return View("Contact");
}
[Route("about")]
public ViewResult About()
{
return View("About");
}
[Route("terms-and-conditions")]
public ViewResult TermsAndConditions()
{
return View("TermsAndConditions");
}
}
仅供参考,这是我的路线配置:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapMvcAttributeRoutes();
routes.LowercaseUrls = true;
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
和 Application_Start 事件:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
我没有使用空值作为路由前缀,而是在特定的控制器操作上使用了路由属性,如下所示:
public class HomeController : Controller
{
public ViewResult Index()
{
return View("Index");
}
[Route("contact-us")]
public ViewResult Contact()
{
return View("Contact");
}
[Route("about-us")]
public ViewResult About()
{
return View("About");
}
[Route("terms-and-conditions")]
public ViewResult TermsAndConditions()
{
return View("TermsAndConditions");
}
}
这可确保从站点的根目录访问每个定义的路由。