【问题标题】:Create object from List elements从 List 元素创建对象
【发布时间】:2014-04-24 13:31:57
【问题描述】:

很抱歉,标题可能提供的信息不足,但我不知道如何解释我想在问题中做什么。

所以,我有一个 MVC 应用程序,我正在从 Web.config 的配置部分加载我的路由。

为了从配置的元素中封装我需要的所有信息,我创建了一个 RouteModel。

IEnumerable<RouteModel> configuredRoutes = RoutingFacade.GetAllRoutes();

foreach(RouteModel route in configuredRoutes)
{
    routes.MapRoute(route.Name, route.Url,
                    new { controller = "Home", action = "Index", managers = route.Managers });
}

忽略那边的 manager 键。

到目前为止一切顺利,但我的问题是这个。
我的RouteModel 有一个Constraints 属性,该属性返回一个List&lt;ConstraintModel&gt;,其中包含该路由的所有配置约束。
ConstraintModel 只有两个属性,Name 和Value。

您可能知道,MapRoute 方法需要一个额外的 object 参数,这是约束,这个对象的构造如下:

new { constraint1 = value1, constraint2 = value2, .. }

我怎样才能把我的List&lt;ConstraintModel&gt; 变成这样的东西?

非常感谢您花时间阅读我的问题,非常感谢您

【问题讨论】:

  • 您需要问自己的问题是,这将如何出现在查询字符串中。查询字符串是简单的名称:值字符串。所以你不能在查询字符串中表示一个复杂的对象,所以你不能将它传递给动作(无论如何都不能作为 GET)。 POST 是不同的。这是 GET 还是 POST 或两者兼而有之?
  • 很抱歉,我不理解您的担忧,但 HTTP 方法将是一个 GET :)

标签: c# asp.net .net asp.net-mvc visual-studio


【解决方案1】:

如果您查看 RouteCollection 类的方法,您会注意到有一个 Add 方法 (MSDN article here)。

你可以做的是你可以调用它(这就是 MapRoute 扩展方法最终所做的) 并根据需要创建Route 类的实例。

Dictionary<string, object> constraints = new Dictionary<string, object>();
// populate your constraints into the constraints dictionary here..

Dictionary<string, object> dataTokens = new Dictionary<string, object>();
Dictionary<string, object> defaults = new Dictionary<string, object>();

Route route = new Route(" << url >> ", new MvcRouteHandler())
{
    Constraints = new RouteValueDictionary(constraints),
    DataTokens = new RouteValueDictionary(),
    Defaults = new RouteValueDictionary()
};

routes.Add(route);

这样,您就有机会为您的约束指定 string - object 对。

编辑

另外,如果你对如何使用此方法有任何疑问,但对MapRoute扩展方法所关心的问题很熟悉,我建议你使用ILSpy来反汇编定义MapRoute的程序集(即@ 987654332@),一步一步去发现MapRoute和RouteCollection.Add之间的联系。

编辑 2 - 关于路线名称

您还可以检查过载RouteCollection.Add(string name, RouteBase item)。 这是您可以指定路线名称的一种方式。

所以基本上你可以这样做:

routes.Add(" My route with dynamically loaded constraints ", route);

【讨论】:

  • 这是一个非常有趣的答案。如何指定路线名称?
  • 这似乎解决了我所有的顾虑,我会试试看,然后回来告诉我消息。谢谢!
  • 好的,我成功地绘制了路线及其约束,感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-31
相关资源
最近更新 更多