MVC 5 属性路由:从控制器操作中删除不必要的路由属性



我有一个要求,即无需在URL中输入控制器名称即可访问主控制器上的资源。例如,当我导航到mysite.com/时,应该加载index操作,并且应该使用mysite.com/contact加载联系页面,依此类推。

下面的控制器满足此要求,但我想知道是否有办法删除与控制器操作同名的路由属性?

例如,将[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);
    }

我没有使用空值作为路由前缀,而是在特定控制器操作中使用了 route 属性,如下所示:

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");
    }
}

这可确保从站点的根目录访问每个定义的路由。

相关内容

  • 没有找到相关文章

最新更新