Routes with multiple arguments in ASP.NET MVC 3

狂风中的少年 提交于 2019-12-25 04:44:44

问题


I am trying to set up dynamic routes in an MVC app, and I have this so far...

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
                } 
            );
        }

And that is working great for now, the only issue I am having is that I would like to have the ability to specify a comma delimited list of optional arguments in the database that I could pull out like...

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

But I was not sure how to stick those params into the route object properly. Could just be a minor C# syntax I am not familiar with.


回答1:


I very well may be wrong, but I believe you can use IDictionary<string, object> for the 3rd parameter to MapRoute instead of an anonymous object (MSDN documentation is unusually sparse for MVC).

I tried to whip up a test proj quick and it seems to work.

Here's what your code would look like if you tried to use a dictionary (again, I'm not certain this will work):

        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
            );
        }



回答2:


Thanks to @qstarin I was pointed in the right thought process...

After much trouble and hardship...

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);
        }

This was my solution...



来源:https://stackoverflow.com/questions/4737827/routes-with-multiple-arguments-in-asp-net-mvc-3

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!