代码之家  ›  专栏  ›  技术社区  ›  Jonathan Smith

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

  •  2
  • Jonathan Smith  · 技术社区  · 11 年前

    我有以下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 因此,当我试图将表单发回时,视图模型中的所有财产都为空。如何确保HTML控件获得唯一的名称,以便模型绑定器可以在POST中使用它们?

    3 回复  |  直到 11 年前
        1
  •  2
  •   Sergio    11 年前

    如果您的方法期望模型为 IEnumerable<...> 你可以使用 Html.TextBox 助手而不是 Html.TextBoxFor :

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

    假设您的型号名称为 ModelName 它有属性 ModelField

        2
  •  1
  •   ssimeonov    11 年前

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

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

        3
  •  0
  •   James    11 年前

    您可以这样做:

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