在循环中使用.Where()。FirstOrDefault()时ASP MVC中的非唯一名称

时间:2014-02-18 08:53:06

标签: 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="#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>
}

但是为每个TextBoxFor控件生成的HTML具有相同的Amount_DEC名称,因此,当我尝试发布表单时,我的viewmodel中的所有属性都为null。如何确保我的HTML控件获得唯一的名称,以便模型绑定器可以在POST中使用它们?

3 个答案:

答案 0 :(得分:2)

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

@Html.TextBox(string.Format("ModelName[{0}].ModelField", i), yourValueHere)

假设您的模型名称为ModelName且其属性为ModelField

答案 1 :(得分:1)

您可以尝试使用以下内容替换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;
    }
}

这不是最好的解决方案,但它应该适用于你的情况。

答案 2 :(得分:0)

你可以这样做:

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