【问题标题】:MVC 5 Attribute Routing: Removing Unnecessary Route Attribute From Controller ActionsMVC 5 属性路由:从控制器操作中删除不必要的路由属性
【发布时间】:2017-06-09 01:09:01
【问题描述】:

我有一个要求,即无需在 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);
    }

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-5 asp.net-mvc-routing attributerouting


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-11-01
      • 2013-10-28
      • 1970-01-01
      • 1970-01-01
      • 2016-05-22
      • 2017-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多