2011-01-19 149 views
0

我试图建立动态路由在MVC应用程序,我有这个迄今为止...路由在ASP.NET MVC多个参数3

string conString = "YATAYATAYATA"; 

     SqlConnection con = new SqlConnection(conString); 
     SqlCommand cmd = new SqlCommand(); 

     // Retrieve routes from database 
     cmd.CommandText = "SELECT R.*,S.* FROM Routes R INNER JOIN Sites S ON S.ID = R.SiteID WHERE S.ID = 1"; 
     cmd.CommandType = CommandType.Text; 
     cmd.Connection = con; 

     con.Open(); 

     SqlDataReader rdr = cmd.ExecuteReader(); 

     while (rdr.Read()) 
     { 
      routes.MapRoute(
      rdr["name"].ToString(),    // Route name 
      rdr["url"].ToString(), // URL with parameters 
       new 
       { 
        controller = rdr["controller"].ToString(), // Controller name 
        action = rdr["action"].ToString(),   // Action name 
        id = UrlParameter.Optional     // Parameter defaults 
       } 
      ); 
     } 

,这是目前工作的伟大,我遇到的唯一问题是,我想有指定的,我可以拉出来像数据库可选参数以逗号分隔列表的功能...

Array optParams = rdr["parametersOpt"].ToString().Split(','); 

但我不知道如何正确地将这些参数粘贴到路线对象中。可能只是一个我不熟悉的小C#语法。

+2

ÿ你应该接受你的问题的答案。 – SLaks 2011-01-19 16:28:28

+0

糟糕...我想我忘了这么做......谢谢!我显然是一个noob ... – jcreamer898 2011-01-19 16:30:07

回答

1

感谢@qstarin我指出了正确的思考过程...

许多麻烦和困难后...

while (rdr.Read()) 
     { 
      Route invRoute = new Route(rdr["url"].ToString(), new MvcRouteHandler()); 

      RouteValueDictionary defaults = new RouteValueDictionary(); 
      defaults.Add("controller", rdr["controller"].ToString()); 
      defaults.Add("action", rdr["action"].ToString()); 

      Array arrParams = rdr["parametersOpt"].ToString().Split(','); 

      foreach (string i in arrParams) 
      { 
       defaults.Add(i, UrlParameter.Optional); 
      } 

      invRoute.Defaults = defaults; 

      routes.Add(rdr["name"].ToString(), invRoute); 
     } 

这是我的解决方案...

1

我很可能是错的,但我相信你可以使用IDictionary<string, object>作为MapRoute的第三个参数而不是匿名对象(对于MVC MSDN文档非常稀疏)。

我试图快速启动一个测试程序,它似乎工作。

这里是你的代码是什么样子,如果你想使用字典(再次,我不能肯定这将工作):

 while (rdr.Read()) { 
      var defaults = new Dictionary<string, object>() { 
                   {"controller", rdr["controller"].ToString()}, 
                   {"action", rdr["action"].ToString()}, 
                   {"id", UrlParameter.Optional} 
                  }; 
      foreach (var param in rdr["parametersOpt"].ToString().Split(',')) { 
       defaults.Add(param, UrlParameter.Optional); 
      } 

      routes.MapRoute(
       rdr["name"].ToString(),    // Route name 
       rdr["url"].ToString(), // URL with parameters 
       defaults 
      ); 
     }