动态ASP.Net路由问题

时间:2011-01-31 05:59:56

标签: asp.net-mvc routing

我是ASP.Net MVC的新手。可能这个问题看起来很简单,但我无法修复它。在这里的情景。我有一个基于城市的应用程序列表数据。所以网址看起来像这样

        www.xxxxxx.in/chennai
        www.xxxxxx.in/mumbai
        www.xxxxxx.in/delhi

在正常路由中,第一部分(chennai / mumbai)是上面url中的控制器,但是在这里我不希望这是一个控制器。相反,我想将单个控制器(LocationController)映射到这些URl。因为以后我可以添加任意数量的城市。

我很震惊,有人可以帮助我。

4 个答案:

答案 0 :(得分:2)

试试这个:

  routes.MapRoute(
            "CityRoute",                                              // Route name
            "{city}",                           // URL with parameters
            new { controller = "Location", action = "Index", city = "" }  // Parameter defaults
        );

答案 1 :(得分:1)

我不确定是否比这更容易选择,但你可以试试这个 - 使用路线约束。基本上,您需要知道您拥有的城市列表,然后限制路线以仅匹配该列表中的条目。

路线约束可以按如下方式实施

public class CityConstraint : IRouteConstraint
{
    public static IList<string> CityNames = (Container.ResolveShared<ICityService>()).GetCities();

    bool _IsCity;
    public CityConstraint(bool IsCity)
    {
        _IsCity = IsCity;            
    }

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        if (_IsCity)
            return CityNames.Contains(values[parameterName].ToString().ToLower());
        else
            return !CityNames.Contains(values[parameterName].ToString().ToLower());
    }
}

然后将路线如下:

routes.MapRoute("Location", "{cityName}", new { controller = "LocationController", action = "Index" }, new { cityName = new CityConstraint(true) });

还要确保在默认路线

之前列出上述路线
routes.MapRoute("Default", // Route name
                "{controller}/{action}/{id}", // URL with parameters
                new { controller = "Home", action = "Index", id = UrlParameter.Optional
            );

另请注意,控制器名称不能是城市名称。

试试这个并看看。

答案 2 :(得分:1)

如果您的所有路由都与这些城市相关而不是删除默认路由并将其替换为此路由定义:

routes.MapRoute(
    "Default",
    "{city}",
    new { controller = "Location", action = "Index", city = "Mumbai" }
);

然后创建一个LocationController类:

public class LocationController : Controller
{
    public ActionResult Index(string city)
    {
        // do whatever needed; "city" param has the city specified in URL route
    }
}

如果您仍然需要其他页面的默认路由(控制器/操作/ ID)而不仅仅是城市,那么最好对您的默认路由设置约束并将其定义如下:

routes.MapRoute(
    "Default",
    "{controller}/{action}/{id}",
    new { controller = "Home", action = "Index", id = UrlParameter.Optional },
    new { controller = "Home|...|..." } // put all controllers here except "Location"
);
routes.MapRoute(
    "Location",
    "{city}",
    new { controller = "Location", action = "Index", city = "Mumbai" }
);

这将使其他控制器仍然工作,位置也将正常工作。问题当然是,如果城市名称与其中一个常规控制器的名称相同。 :)但你也可以控制/避免这种情况。

答案 3 :(得分:0)

您可以通过添加硬编码控制器名称的路径来完成此操作:

routes.MapRoute(
  "location", // Route name
  "{cityName}", // URL with parameters
  new { controller = "location", action = "index" } // Parameter defaults
);

routes.MapRoute(
  "Location", // Route name
  "{controller}/{action}/{cityName}", // URL with parameters
   new { controller = "Location", action = "index"} // Parameter defaults
)

这会将表单“/ mumbai”的所有请求路由到LocationController操作方法Index,参数cityName设置为“mumbai”。它还可以使用第二条路径路由完整的控制器/动作规范。