2011-01-19 208 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 
      ); 
     }