Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.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# 在循环中使用.Where().FirstOrDefault()时,ASP MVC中的名称不唯一_C#_Asp.net Mvc_Razor - Fatal编程技术网

C# 在循环中使用.Where().FirstOrDefault()时,ASP MVC中的名称不唯一

C# 在循环中使用.Where().FirstOrDefault()时,ASP MVC中的名称不唯一,c#,asp.net-mvc,razor,C#,Asp.net Mvc,Razor,我有以下ASP MVC RAZOR代码: @foreach (var prod in Model.allProducts) { <div class="accordion-group"> <div class="accordion-heading"> <a class="accordion-toggle" data-toggle="collapse" data-parent="accordion2" href="

我有以下ASP MVC RAZOR代码:

@foreach (var prod in Model.allProducts)
{   
    <div class="accordion-group">
        <div class="accordion-heading">
            <a class="accordion-toggle" data-toggle="collapse" data-parent="accordion2" href="#collapse@(i)">
                <h4 class="widgettitle" id="Title">> @prod.Description_VC</h4>
            </a>
        </div>
        <div id="collapse@(i)" class="accordion-body collapse" style="height: 0px;">
            <div class="accordion-inner" style="margin-left: 10px;">
                <div style="padding-bottom: 10px;">
                    <strong>Total for product:</strong> 
                    @Html.TextBoxFor(o => o.OfferHeaders.Where(p => p.Product_ID == prod.Product_ID).FirstOrDefault().Amount_DEC)
                </div>    
            </div>
        </div>
    @{i++;}
    <div style="clear:both;"></div>
    </div>
}
@foreach(Model.allProducts中的var prod)
{   
产品总计:
@Html.TextBoxFor(o=>o.OfferHeaders.Where(p=>p.Product\u ID==prod.Product\u ID).FirstOrDefault().Amount\u DEC)
@{i++;}
}

但是为每个TextBoxFor控件生成的HTML具有相同的名称
Amount\u DEC
,因此,当我尝试发回表单时,viewmodel中的所有属性都为null。如何确保我的HTML控件获得唯一的名称,以便model binder可以在文章中使用它们?

您可以尝试用以下内容替换TextBoxFor代码:

@for (int j = 0; j < o.OfferHeaders.Count(); j++)
{
    if (o.OfferHeaders[j].Product_ID == prod.Product_ID)
    {
        @Html.TextBoxFor(o => o.OfferHeaders[j].Amount_DEC)
        break;
    }
}
for(int j=0;jo.OfferHeaders[j].Amount\u DEC) 打破 } }
这不是最好的解决方案,但应该适用于您的情况。

如果您的方法希望模型为
IEnumerable
,则可以使用
Html.TextBox
帮助程序,而不是
Html.TextBoxFor

@Html.TextBox(string.Format("ModelName[{0}].ModelField", i), yourValueHere)
假设您的模型名为
ModelName
,并且它具有属性
ModelField

,则可以执行以下操作:

@Html.TextBoxFor(o => o.OfferHeaders
                       .Where(p => p.Product_ID == prod.Product_ID)
                       .FirstOrDefault().Amount_DEC, 
                 //unique name set here
                 new { Name = "txt1" })

感谢您的编辑,由于愚蠢的Mac键盘,我很难正确使用它。为什么不使用o.OfferHeaders.FirstOrDefault(p=>p.Product\u ID==prod.Product\u ID).Amount\u DEC)。如果可以在SingleOrDefault函数中传递谓词,为什么要调用Where()?我现在要试试这个。当你说“这不是最好的解决方案”时,你会建议改进什么?我的意思是,这不是生成文本框的最快方法。如果更改视图的结构,您可以对其进行改进,但对于当前的结构,我不确定是否有可能更快地生成文本框。如果我重新调整视图,以便可以将Where().FirstOrDefault()的结果传递到循环每次迭代的EditorTemplate中,你认为渲染引擎会生成唯一的对象名吗?我不这么认为。如果在EditorTemplate中使用此方法,则必须实现Sergio解释的方法。我已进行了此更改,尽管它现在正在生成唯一名称(高兴),但我的提交按钮已停止工作(不高兴)。没有调用控制器上的POST方法。如果可以在SingleOrDefault函数中传递谓词,为什么要调用Where()?