10

非常简单的问题,但我找不到答案:

我的global.asax中有默认{controller}/{action}/{id}模式。

我还需要一些东西会给我类似www.example.com/microsoftwww.example.com/apple而微软和苹果id存储在数据库中的东西。使用默认模式是:www.example.com/brands/detail/microsoft

知道模式应该是怎样的吗?我试过:{id}并将控制器和操作设置为brandsdetail它可以满足我的需要,但会破坏所有其他模式。

谢谢

4

2 回答 2

6

我会建议一个单独的路线,其约束条件是 id 要么不能匹配您的控制器之一,要么必须匹配数据库中的一个 id。将其列在默认路由之前,以便在满足条件时首先匹配。

使用简单正则表达式作为固定约束的示例,尽管您可能希望创建一个从 IRouteConstraint 派生的自定义约束,以动态限制值。

routes.MapRoute(
  "Brands",
  "{id}",
  new { controller = "brand", action = "detail" },
  new { id = "^(Microsoft)|(Apple)$" }
);

您可能想查看http://stephenwalther.com/blog/archive/2008/08/07/asp-net-mvc-tip-30-create-custom-route-constraints.aspx以获得更多想法。

于 2012-04-20T01:31:47.740 回答
5

您的路线顺序很重要。因此,创建一个处理所有可用控制器的第一个路由定义,然后提及一个将处理其余请求的路由定义。在那里你将处理www.yousite.com/apple那种请求

routes.MapRoute("Default",  // Route name
                  "{controller}/{action}/{id}", // URL with parameters
                    new { controller = "Home", action = "Index", id = "" },
                    new { controller = new FromValuesListConstraint("Home", "Account","OtherOne") }
                );

 // to handle personalize user url
routes.MapRoute("user","{url}", new {controller="Home",action="Profile",url = "" });

现在创建一个FromValuesListContraint继承自 IRouteConstraint的新类

public class FromValuesListConstraint : IRouteConstraint
{
    private string[] _values;

    public FromValuesListConstraint(params string[] values)
    {
        this._values = values; 
    }

    public bool Match(HttpContextBase httpContext, Route route, string parameterName,
    RouteValueDictionary values, RouteDirection routeDirection)
    {
        // Get the value called "parameterName" from the
        // RouteValueDictionary called "value"

        string value = values[parameterName].ToString();

        // Return true is the list of allowed values contains
        // this value.

        for (int i = 0; i < _values.Length; i++)
            if (SContains(_values[i], value, StringComparison.OrdinalIgnoreCase ))
                return true;

        return false;
    }    

    public bool SContains(string source, string toCheck, StringComparison comp)
    {
        return source.IndexOf(toCheck, comp) >= 0;
    }
}

ProfileHome 中的操作方法读取参数值并从数据库中获取数据。

 public ActionResult Profile(string url)
 {
    //url variable will have apple or microsoft . You may get data from db and return a view now.
 }

因此,每当请求到来时,它将检查它是否是可用的控制器(您在第一个路由定义中传递给 FromValuesListContraint 类构造函数),如果可用,那么它将用于该路由,否则,它将用于一般(默认)路线作为第二条路线提及。

在这个例子中,Home、Account 和 OtherOnes 是我可用的控制器。每当您向项目添加新控制器时,您都希望将其添加到 FromValuesListConstraint 类构造函数的构造函数中。

简单地说它就像捕获一些特定异常并在没有捕获到一般异常时进入一般异常!:)(只是一个理解的例子)

于 2012-04-20T01:44:20.697 回答