一种观点上的多种形式

时间:2014-12-22 06:43:35

标签: c# asp.net-mvc razor

请原谅代码的一些混乱。我试图创建一个显示文本输入的页面,并提供多个选项来提交具有不同参数的帖子,同时还传递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。当提交页面上的第一个表单时,库存清单中会填充正确的库存对象。

如果有更好的解决办法,请告诉我,因为这就是我想出来的。

由于

1 个答案:

答案 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表达式的上下文必须匹配。