请原谅代码的一些混乱。我试图创建一个显示文本输入的页面,并提供多个选项来提交具有不同参数的帖子,同时还传递List中包含的每个项目的文本输入值。我将List作为ViewModel的属性传递给视图。
我有一个For循环遍历列表,为循环中的每个项生成一个单独的表单。
@for(int s =0;s<Model.stocklist.Count; s++)
{
using(Html.BeginForm("ProcessTransaction","MoveProductByInventory",FormMethod.Post))
{
@Html.DisplayFor(m => m.stocklist[s].StorageLocation.Description)
<span>
@Html.DisplayFor(m => m.stocklist[s].UnitCurrent)
</span>
@Html.EditorFor(m => m.tranamount)
@Html.HiddenFor(m => m.transunittype)
@Html.HiddenFor(m => m.trantypeenum)
@Html.HiddenFor(m => m.stocklist[s].StockID)
<input type="submit" name="Submit" value="Add" id="btnadd" />
<input type="submit" name="Submit" value="Remove" id="btnremove"/>
}
}
循环的第一次迭代完美地运行,但由于某种原因,第二个,第三个等等的值被传回null。
具体来说,stocklist属性包含Stock对象,定义如下:
public List<Stock> stocklist { get; set; }
我希望ViewModel.stocklist包含Stock对象,该对象与我在for循环迭代生成的页面上选择的Submit按钮有关。
@Html.HiddenFor(m => Model.stocklist[s].StockID)
为每个循环迭代在页面上生成正确的StockID值。由于某种原因,在提交特定表格时(第一次迭代除外),库存清单不会带来库存对象。它抛出一个空引用异常,并且stocklist为null。当提交页面上的第一个表单时,库存清单中会填充正确的库存对象。
如果有更好的解决办法,请告诉我,因为这就是我想出来的。
由于
答案 0 :(得分:0)
只要有可能,您应该在lambda函数中使用___For
的lambda参数(在本例中为m
):
@for(int s =0;s<Model.stocklist.Count; s++)
{
using(Html.BeginForm("ProcessTransaction","MoveProductByInventory",FormMethod.Post))
{
@Html.DisplayFor(m => m.stocklist[s].StorageLocation.Description)
<span>
@Html.DisplayFor(m => m.stocklist[s].UnitCurrent)
</span>
@Html.EditorFor(m => m.tranamount)
@Html.HiddenFor(m => m.transunittype)
@Html.HiddenFor(m => m.trantypeenum)
@Html.HiddenFor(m => m.stocklist[s].StockID)
<input type="submit" name="Submit" value="Add" id="btnadd" />
<input type="submit" name="Submit" value="Remove" id="btnremove"/>
}
}
这应该通常会给出最好的结果,我相信在这种情况下它会解决你的问题。
至于为什么,@ TrueBlueAussie在评论中提供了以下解释:
DisplayFor
和其他方法使用反射来拉开lambda表达式的表达式树以创建客户端元素的命名,因此lambda表达式的上下文必须匹配。