希望您能帮我解决以下问题。我正在使用控制器部件将多个记录上传到数据库。但是我的索引[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”类型的表达式
我想我差不多了,你知道如何解决这个问题吗?
型号:
public int ID { get; set; }
public string Country { get; set; }
public string Format { get; set; }
public Nullable<decimal> Ratio { get; set; }
答案 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