Asp.net mvc ASP.Net MVC路由:仅具有字符串ID的Url

Asp.net mvc ASP.Net MVC路由:仅具有字符串ID的Url,asp.net-mvc,url-routing,Asp.net Mvc,Url Routing,这个问题很简单,但我找不到答案: 我在my global.asax中有默认的{controller}/{action}/{id}模式 我还需要一些东西,比如www.example.com/microsoft或www.example.com/apple,而微软和苹果都id存储在数据库中。使用默认模式将是:www.example.com/brands/detail/microsoft 你知道该怎么做吗? 我尝试:{id}并将控制器和操作设置为品牌和细节它可以满足我的需要,但会破坏所有其他模式 谢谢我

这个问题很简单,但我找不到答案:

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

我还需要一些东西,比如www.example.com/microsoft或www.example.com/apple,而微软和苹果都
id
存储在数据库中。使用默认模式将是:www.example.com/brands/detail/microsoft

你知道该怎么做吗? 我尝试:
{id}
并将控制器和操作设置为
品牌
细节
它可以满足我的需要,但会破坏所有其他模式


谢谢

我建议使用一个单独的路由,该路由带有一个约束,即id不能匹配您的一个控制器,或者必须匹配数据库中的一个id。在默认路由之前列出它,以便它首先匹配(如果符合条件)

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

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

您可能想了解更多想法。

您的路线顺序很重要。因此,首先创建一个处理所有可用控制器的路由定义,然后提到一个将处理其余请求的路由定义。您将在那里处理
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 = "" });
现在创建一个名为
fromValuesListContrain
的新类,该类继承自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;
    }
}
因此,每当请求出现时,它都会检查它是否是可用的控制器(您在第一个路由定义中将其传递到FromValuesListContrain类构造函数中),如果可用,则它将用于该路由,否则,它将用于第二个路由中提到的常规(默认)路由

在本例中,Home、Account和Other是我可用的控制器。无论何时向项目添加新控制器,都希望将其添加到FromValuesListConstraint类构造函数的构造函数中


简单地说,它的工作原理类似于捕获某些特定异常,如果没有捕获到任何异常,则转到常规异常!:)(只是一个需要理解的示例)

似乎不可能,因为您无法从www.example.com/login中分辨出www.example.com/apple是否第一个是品牌Id,第二个是控制器名称。除非您编写自己的自定义路由提供程序并检查该部分是否应为品牌或控制器名称。但对于大多数情况下的路由器来说,这太复杂了…这很好..我实现了我的路由url,就像这个新的{Controller=“Home”,action=“Index”,id=”“}我可以得到如下url:。你知道为什么我的modelstate.isvalid获取错误吗?它显示值“chjnvd780”对Id无效。您知道如何解决它吗?
 public ActionResult Profile(string url)
 {
    //url variable will have apple or microsoft . You may get data from db and return a view now.
 }