我有以下代码,我用它来从表单集合中获取值
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行是bool而tbl是int
任何人都可以告诉我我缺少的东西
--------------额外代码-------------------
public ActionResult FlowItems(FormCollection fc)
lst是在foreach循环中
答案 0 :(得分: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);
}
这种做法有一个警告。如果col1
或col2
中缺少数据。 e.g。
var col3 = new NameValueCollection
{
{ "IsVisible", "True" },
{ "Editable", "" },
// { "Revisable", "True" }, Missing this entry
{ "tblId", "102" },
};
然后循环超出范围。
答案 1 :(得分:0)
问题可能是该集合包含逗号分隔的值(我假设因为问题开头是Split()
),但在for循环中,您直接使用该值而不分割在逗号上。所以我想它会尝试从值的第二个字符(索引为1)创建一个bool。
请改为尝试:
foreach (var _key in fc.Keys)
{
var _value = fc[_key.ToString()];
string[] tokenized = _value.Split(',');
bool b = Convert.ToBoolean(tokenized[1]);
}