MVC控制器索引十进制

时间:2015-01-18 14:51:09

标签: c# asp.net-mvc database

希望您能帮我解决以下问题。我正在使用控制器部件将多个记录上传到数据库。但是我的索引[i]INDX.Ratio)存在问题。

这是我的控制器代码:

[HttpPost]
    public ActionResult Index_Ratio_Save(FormCollection C)
    {
        int i = 0;

        if (ModelState.IsValid)
        {
            var IDArray = C.GetValues("item.ID");
            var CountryArray = C.GetValues("item.Country");
            var FormatArray = C.GetValues("item.Format");
            decimal RatioArray = Convert.ToDecimal(C.GetValues("item.Ratio"));

            for (i = 0; i < IDArray.Count(); i++) 
            {
                C_004_Index_Ratio INDX = dbcloud.C_004_Index_Ratio.Find(Convert.ToInt32(IDArray[i]));
                INDX.Country = CountryArray[i];
                INDX.Format = FormatArray[i];
                INDX.Ratio = RatioArray[i];

                dbcloud.Entry(INDX).State = EntityState.Modified;
            }

            dbcloud.SaveChanges();
        }

        return View();
    }

INDX.Ratio = RatioArray[i]给出了以下错误:

  

无法将带有[]的索引应用于“decimal”类型的表达式

我想我差不多了,你知道如何解决这个问题吗?

UPDATE:

型号:

    public int ID { get; set; }
    public string Country { get; set; }
    public string Format { get; set; }
    public Nullable<decimal> Ratio { get; set; }

2 个答案:

答案 0 :(得分:2)

RatioArray不是数组,您将其定义为单个项目。它需要像这样定义:

decimal[] RatioArray = ...

然而,这里的问题是,从FormsCollection中检索项目的代码将无法以这种方式工作。您只转换单个项目,因为Convert.ToDecimal()仅适用于单个项目。

你会想做这样的事情:

 decimal[] RatioArray = Array.ConvertAll(c.GetValues("item.Ratio"), double.Parse);

查看您的模型,看起来您的模型也不支持数组。所以看起来你的问题可能比这个问题要大得多。

然而,你真的应该只使用模型绑定,从那时起你就会自动获得这个功能,并获得验证支持。

答案 1 :(得分:0)

我从POST方法中看到,您的视图正在呈现对象集合,并且您使用foreach循环来呈现控件,从而导致无索引name属性,这些属性无法绑定到集合(由于重复id属性,可能无效的html)。相反,利用MVC的内置模型绑定功能,以便您可以POST回并绑定到您的模型,例如

查看

@model IList<YourModel>
@using(Html.BeginForm())
{
  for(int i = 0; i < Model.Count; i++)
  {
    @Html.HiddenFor(m => m[i].ID)
    @Html.TextBoxFor(m => m[i].Country)
    @Html.TextBoxFor(m => m[i].Format)
    @Html.TextBoxFor(m => m[i].Ratio)   
  }
  <input type="submit" />
}

这将生成名为输入的属性,其中包含用于绑定的索引器

<input type="hidden" name="[0].ID" ...>
<input type="hidden" name="[0].Country" ...>
....
<input type="hidden" name="[1].ID" ...>
<input type="hidden" name="[1].Country" ...>
....

然后将控制器更改为

[HttpPost]
public ActionResult Index_Ratio_Save(IEnumerable<YourModel> model)

并且模型将正确绑定到集合。请注意,使用for循环的替代方法是为对象

创建自定义EditorTemplate

/Views/Shared/EditorTemplates/YourModel.cshtml

@Model YourModel
@Html.HiddenFor(m => m.ID)
@Html.TextBoxFor(m => m.Country)
...

并在视图中

@model IEnumerable<YourModel>
@using(Html.BeginForm())
{
  @Html.EditorFor(m => m)
  <input type="submit" />
}

生成相同的html(允许集合为IEnumerable而不是IList