【问题标题】:Routes with multiple arguments in ASP.NET MVC 3ASP.NET MVC 3 中具有多个参数的路由
【发布时间】:2011-01-19 16:25:07
【问题描述】:

我正在尝试在 MVC 应用程序中设置动态路由,到目前为止我已经做到了...

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# 语法。

【问题讨论】:

  • 你应该接受你的问题的答案。
  • 哎呀...我想我忘了这样做...谢谢!我显然是个菜鸟……

标签: c# asp.net asp.net-mvc routes


【解决方案1】:

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

我试图快速启动一个测试项目,它似乎可以工作。

如果您尝试使用字典,您的代码将如下所示(同样,我不确定这是否有效):

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

【讨论】:

  • 您介意快速了解一下您使用的内容吗?那太好了!
  • 编辑了我的答案。我仍然不能完全确定可以使用字典代替匿名对象。如果可以的话,这应该工作..如果我理解你正确地使用参数做什么。
  • 我有一个错字 - 错误地引用了 param 变量。我已经在我的回答中修正了它。
【解决方案2】:

感谢@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);
        }

这是我的解决方案...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2013-12-27
    • 2016-10-01
    • 1970-01-01
    • 2011-09-25
    相关资源
    最近更新 更多