通过以某个字符串开头的键切片FormCollection

时间:2011-02-03 23:55:51

标签: c# asp.net-mvc

是否有一种很好的 linqy 方法可以将FormCollection拆分为仅包含以某个字符串开头的那些键的Dictionary<string,string>

(这个问题与this-&gt;基本相同,但对于C#/ FormCollection而不是python Slicing a dictionary by keys that start with a certain string

以下是我想出来解决问题的方法:

public ActionResult Save(FormCollection formCollection) {
  var appSettings = new Dictionary<string, string>();
  var appKeys = formCollection.AllKeys.Where(k => k.StartsWith("AppSettings."));
  foreach (var key in appKeys)
  {
      appSettings[key] = formCollection[key];
  }
...

编辑:这段代码的问题在于,我必须多次为不同的StartsWith字符串执行此操作,因此需要创建一个“实用程序”方法来执行上述操作。 如果能在一行中读取它会很好:

formCollection.Where(k=>k.Key.StartsWith("AppSettings.");

后台(没有必要解决问题):上下文是asp.net mvc,以及带有动态字典字典的表单。

它也类似于这个问题 - Return FormCollection items with Prefix - 但不完全相同。

在阅读了这个答案后How to build C# object from a FormCollection with complex keys - 我开始怀疑,即使不使用表格帖子,我也会更好,而是发送JSON。

2 个答案:

答案 0 :(得分:16)

如果你正在寻找一种“好”的方式来获取一个现有的字典,生成一个带有键+值副本的新字典,对于一个键的子集,一些LINQ代码可以很好地完成这个:

var appSettings = formCollection.AllKeys
    .Where(k => k.StartsWith("AppSettings."))
    .ToDictionary(k => k, k => formCollection[k]);

答案 1 :(得分:-6)

[HttpPost]
public ActionResult Index(FormCollection collection)
{
     Dictionary<string,object> form = new Dictionary<string, object>();
     collection.CopyTo(form);
     return View();
}