如何在mvc 4中定义自定义路由时跳过其他操作名称

时间:2013-09-17 14:30:28

标签: asp.net-mvc asp.net-mvc-4 razor asp.net-mvc-routing routes

我希望我的访问者能够通过输入该商家的名称来重定向到商家的详细信息页面。 所以我有这个自定义路线:

routes.MapRoute(
                "Business", 
                "{name}", 
                new { controller = "Business", action = "Show" },
                new[] { "Sample.Web.UI.Controllers" });

我默认这个:

routes.MapRoute(
                "Default",
                "{controller}/{action}/{id}",
                new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                new[] { "Sample.Web.UI.Controllers" });

在自定义之后订购。 最后,我有一个名为show的动作,通过访问者输入的名称获取业务。 现在,当我在主页中的每个索引动作方法时,如:

@this.Html.ActionLink("More", "Index", "SomeThing")

重定向到Sample / SomeThing并调用上面提到的 show 操作并返回null。 无论如何我能处理这个吗?

1 个答案:

答案 0 :(得分:1)

我通过添加这个类解决了这个问题:

public class NotEqual : IRouteConstraint
    {
        private readonly ICollection<string> match;

        public NotEqual(ICollection<string> match)
        {
            this.match = match;
        }

        public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
        {
            var result = new List<bool>();
            this.match.ToList()
                .ForEach(m => 
                    result.Add(string.Compare(values[parameterName].ToString(), m, StringComparison.OrdinalIgnoreCase) != 0 &&
                    !values[parameterName].ToString().Contains("Test")));
            return result.TrueForAll(r => r);
        }
    }

制作我的自定义路线:

routes.MapRoute(
                "Business",
                "{name}",
                new { controller = "Business", action = "Show" },
                new { name = new NotEqual(new System.Collections.ObjectModel.Collection<string> { "Foo", "Test" }) },
                new[] { "Sample.Web.UI.Controllers" });