循环表单集合并将数据添加到列表

时间:2015-02-11 16:17:58

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

我有以下代码,我用它来从表单集合中获取值

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循环中

2 个答案:

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

这种做法有一个警告。如果col1col2中缺少数据。 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]);
        }