2012-02-14 151 views
0

有什么办法在定义路由表来传递参数给控制器?传递自定义参数传递给控制器​​在MVC3

因此相同的控制器可以被用于两个或更多个“区段”例如

http://site.com/BizContacts // internal catid = 1 defined in the route   
http://site.com/HomeContacts // internal catid = 3 
http://site.com/OtherContacts // internal catid = 4 

和控制器获取在路由表中定义的由附加的参数在索引动作将被示出上述例子中以过滤和显示数据

所以自定义参数,并示出的数据将是通过为

select * from contacts where cat_id = {argument} // 1 or 3 or 4 

这样的查询返回我希望这是有点清晰

任何帮助表示赞赏?

+0

如果类别名称将是独一无二的,为什么不把它们作为你的过滤器? – 2012-02-14 23:13:00

回答

1

你可以写一个自定义路由:

public class MyRoute : Route 
{ 
    private readonly Dictionary<string, string> _slugs; 

    public MyRoute(IDictionary<string, string> slugs) 
     : base(
     "{slug}", 
     new RouteValueDictionary(new 
     { 
      controller = "categories", action = "index" 
     }), 
     new RouteValueDictionary(GetDefaults(slugs)), 
     new MvcRouteHandler() 
    ) 
    { 
     _slugs = new Dictionary<string, string>(
      slugs, 
      StringComparer.OrdinalIgnoreCase 
     ); 
    } 

    private static object GetDefaults(IDictionary<string, string> slugs) 
    { 
     return new { slug = string.Join("|", slugs.Keys) }; 
    } 

    public override RouteData GetRouteData(HttpContextBase httpContext) 
    { 
     var rd = base.GetRouteData(httpContext); 
     if (rd == null) 
     { 
      return null; 
     } 
     var slug = rd.Values["slug"] as string; 
     if (!string.IsNullOrEmpty(slug)) 
     { 
      string id; 
      if (_slugs.TryGetValue(slug, out id)) 
      { 
       rd.Values["id"] = id; 
      } 
     } 
     return rd; 
    } 
} 

可能在Application_Startglobal.asax注册:

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

    routes.Add(
     "MyRoute", 
     new MyRoute(
      new Dictionary<string, string> 
      { 
       { "BizContacts", "1" }, 
       { "HomeContacts", "3" }, 
       { "OtherContacts", "4" }, 
      } 
     ) 
    ); 

    routes.MapRoute(
     "Default", 
     "{controller}/{action}/{id}", 
     new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
    ); 
} 

最后你可以有你的CategoriesController:

public class CategoriesController : Controller 
{ 
    public ActionResult Index(string id) 
    { 
     ... 
    } 
} 

现在:

  • http://localhost:7060/bizcontacts将击中Categories控制器的Index动作并传递ID = 1
  • http://localhost:7060/homecontacts将击中Categories控制器的Index动作并传递ID = 3
  • http://localhost:7060/othercontacts将击中Categories控制器的Index动作和传ID = 4
+0

看起来不错,这还支持在类别控制器等动作?例如site.com/BizContacts/Edit/4等? – Kumar 2012-02-15 02:48:20

+0

@Kumar,不,它不会。但是您可以通过更改基础构造函数来更新它以支持。您可能还需要修改'{ID}'路线参数'{}类别ID',以便将其与一个在URL的末尾之间的更清楚地区分。 – 2012-02-15 06:28:31