Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 一个视图上的多个表单_C#_Asp.net Mvc_Razor - Fatal编程技术网

C# 一个视图上的多个表单

C# 一个视图上的多个表单,c#,asp.net-mvc,razor,C#,Asp.net Mvc,Razor,请原谅代码的混乱。我试图创建一个显示文本输入的页面,并提供多个选项来提交具有不同参数的帖子,同时还传递列表中包含的每个项目的文本输入值。我将列表作为ViewModel的属性传递给视图 我有一个For循环,它在列表中迭代,为循环中的每个项目生成一个单独的表单 @for(int s =0;s<Model.stocklist.Count; s++) { using(Html.BeginForm("ProcessTransaction","MoveProductByInventory",FormM

请原谅代码的混乱。我试图创建一个显示文本输入的页面,并提供多个选项来提交具有不同参数的帖子,同时还传递列表中包含的每个项目的文本输入值。我将列表作为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"/>
}
}
正在为每个循环迭代在页面上生成正确的StockID值。由于某些原因,除了第一次迭代之外,在提交特定表单时,stocklist没有带来stock对象。它正在抛出null引用异常,并且stocklist为null。提交页面上的第一个表单时,将使用适当的库存对象填充库存列表

请让我知道是否有更好的方法,因为这正是我想到的


感谢

只要有可能,您应该在lambda函数中使用uuu的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表达式的上下文必须匹配


只有在post方法具有参数IEnumerable model时,您所做的操作才能发回,除非是第一个表单,因为索引器必须从零开始,并且是连续的。真正的问题是你为什么要这样做?谢谢你的回答。我试图创建一种快速的方法,为传递给视图的stocklist中包含的任何记录输入数据。下图大致显示了我的意思:。也许我需要考虑使用一个表单来迭代所有股票列表项,然后只使用一个提交按钮提交所有值。这将解决这个问题,并且是一个更好的用户界面。您当前正在生成无效的html大量重复id,包括@html.EditorForm=>m.tranmount、@html.HiddenForm=>m.transunittype等,以及大量不必要的控件,这些都会降低性能。这就是我要介绍的。感谢您的评论。正确,但您需要解释为什么需要这样做:@TrueBlueAussie老实说,我的理解不够深刻,无法确切知道为什么需要这样做。我知道这与分析表达式和确定属性相对于模型的位置有关,但我不知道除此之外的确切原因。有什么提示吗很接近。DisplayFor和其他方法使用反射分离lambda表达式的表达式树以创建客户端元素的命名,因此lambda表达式的上下文必须匹配。@TrueBlueAussie谢谢:我已经在我的回答中添加了您的解释,但在中,Stephen Muecke告诉我,至少在这种情况下,上下文并不重要,所以我仍然有些不知所措-/六羟甲基三聚氰胺六甲醚。。。我必须承认我的第一个想法是这没什么区别。。。试验方法的时间:
   @Html.HiddenFor(m => Model.stocklist[s].StockID) 
@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"/>
    }
}