2015-02-11 51 views
-1

我有以下的代码,我使用的是获得从表单收集值遍历形式收集和将数据添加到列表

List<FlowSettings> lst = new List<FlowSettings>(); 
string[] IsVisible = fc["IsVisible"].Split(','); 
string[] Editable = fc["Editable"].Split(','); 
string[] Revisable = fc["Revisable"].Split(','); 
string[] tbl  = fc["tblId"].Split(','); 

以上阵列是只为我保证我按预期获得数据。我的问题是,我可以遍历的形式收集,但无法获取值出来,并添加到我的清单。

foreach (var _key in fc.Keys) 
{ 
    var _value = fc[_key.ToString()]; 
    //lst.Add(new FlowSettings { TblId = Convert.ToInt32(_value[0]), ChxIsVisible = 
    Convert.ToBoolean(_value[1]), 
    ChxEditable = true, 
    ChxRevisable = true 
    });   
} 

在ISVISIBLE值等有10行这是布尔和TBL是一个int

任何人都可以让我知道我错过

--------- -----额外的代码-------------------

public ActionResult FlowItems(FormCollection fc) 

地表温度在foreach循环

+0

你能证明什么'fc'样子..声明lst'的'实例,但在代码是你真正使用它..你有现有的代码不是很清楚..你可以显示什么价值在'fc',你正在分裂,以获得更好的理解..?谢谢 – MethodMan 2015-02-11 16:28:32

+0

@MethodMan fc在ActionResult中,而lst在foreach循环中 – 2015-02-11 16:35:09

+0

很高兴看到这个值看起来像减轻所有猜测工作的例子。 – MethodMan 2015-02-11 16:39:52

回答

1

FormCollection没有实现IDictionary(TKey,TValue)接口,所以你需要通过循环和获取值。

数据

public class FlowSettings 
{ 
    public bool IsVisible { get; set; } 
    public bool Editable { get; set; } 
    public bool Revisable { get; set; } 
    public int TblId { get; set; } 
} 

private bool ParseBool(string value) 
{ 
    return Convert.ToBoolean(EmptyToFalse(value)); 
} 

private int ParseInt(string value) 
{ 
    return Convert.ToInt32(EmptyToInvalid(value)); 
} 

private string EmptyToFalse(string value) 
{ 
    return string.IsNullOrWhiteSpace(value) ? bool.FalseString : value; 
} 

private string EmptyToInvalid(string value) 
{ 
    return string.IsNullOrWhiteSpace(value) ? "-1" : value; 
} 

创建

var col1 = new NameValueCollection 
{ 
    { "IsVisible", "True" }, 
    { "Editable", "True" }, 
    { "Revisable", "True" }, 
    { "tblId", "100" }, 
}; 

var col2 = new NameValueCollection 
{ 
    { "IsVisible", "True" }, 
    { "Editable", "" }, 
    { "Revisable", "True" }, 
    { "tblId", "101" }, 
}; 

var formCollection = new FormCollection 
{ 
    col1, 
    col2 
}; 

var length = 
    formCollection 
     .Cast<string>() 
     .Select(entry => formCollection.GetValues(entry).Length) 
     .Max(); 

var items = new List<FlowSettings>(); 

for(var i = 0; i < length; i++) 
{ 
    var flowSettings = new FlowSettings 
    { 
     IsVisible = ParseBool(formCollection.GetValues("IsVisible")[i]), 
     Editable = ParseBool(formCollection.GetValues("Editable")[i]), 
     Revisable = ParseBool(formCollection.GetValues("Revisable")[i]), 
     TblId = ParseInt(formCollection.GetValues("tblId")[i]), 
    }; 

    items.Add(flowSettings); 
} 

有一个警告这种方法。如果有数据从col1col2失踪。例如

var col3 = new NameValueCollection 
{ 
    { "IsVisible", "True" }, 
    { "Editable", "" }, 
    // { "Revisable", "True" }, Missing this entry 
    { "tblId", "102" }, 
}; 

然后循环超出界限。

+0

嗨@Romoku感谢,这样的作品,我现在是一名初级程序员用有点多知识:) – 2015-02-11 21:46:01

0

的问题可能是个Ëcollection包含逗号分隔值(我假设,因为Split()一开始你的问题),但在for循环您直接使用值不会对逗号分割。所以我想这将是试图建立一个布尔出来的值的第2个字符(1指数)。

试试这个:

 foreach (var _key in fc.Keys) 
     { 
      var _value = fc[_key.ToString()]; 
      string[] tokenized = _value.Split(','); 
      bool b = Convert.ToBoolean(tokenized[1]); 
     }