从命名集合MVC中提取键值对

时间:2015-12-11 12:45:04

标签: c# asp.net-mvc formcollection

我从松散绑定的剃刀形式中提取表格值。我没有使用强绑定模型的原因是支付值字段和类别是动态的。

到达控制器的表单集合数组如下:

Payment {"1":"120","4":"23","6":"12","8":"120","9":"100"}

我需要拆分数组(当PayCatId = 1,Pay = 120时)(当PayCatId = 4,Pay = 23时)等。

string [] pa =collection["Payment"].Split(char.Parse(","));
string [] pc =collection.AllKeys["Payment"].Split(char.Parse(","));

然后我尝试使用下面的逻辑保存到数据库;

for (var i = 0; i < pa.Length; i++)
{
    payment.Pay = Convert.ToDecimal(pa[i]);                 
    payment.PayCatId = Convert.ToInt32(pa[i]);  (added:how do i get this value from pair?)
    payment.PayDate = DateTime.Now;
    db.Payments.Add(payment);
    db.SaveChanges();
 }

删除了错误位,因为我已经开悟了这种方法不适用 我也想知道这是否是实现这一目标的正确可靠的方法。

2 个答案:

答案 0 :(得分:0)

您可以使用Split,Select和ToDictionary的组合来执行此操作,请参阅代码:

var srt = "\"1\":\"120\",\"4\":\"23\",\"6\":\"12\",\"8\":\"120\",\"9\":\"100\"";

srt.Split(',')
    .Select(x => x.Split(':'))
    .ToDictionary(x => int.Parse(x[0].Replace("\"","")), x => int.Parse(x[1].Replace("\"","")))


/*
    Output: 
    Dictionary<int, int>(5) 
    { 
        { 1, 120 }, 
        { 4, 23 }, 
        { 6, 12 }, 
        { 8, 120 }, 
        { 9, 100 } 
    }
*/

答案 1 :(得分:0)

一次只循环两个步骤而不是一个

for (var i = 0; i < pa.Length; i+=2)
{
    payment.Pay = Convert.ToDecimal(pa[i]);                 
    payment.PayCatId = Convert.ToInt32(pa[i+1]);
    payment.PayDate = DateTime.Now;
    db.Payments.Add(payment);
    db.SaveChanges();
 }
相关问题