【问题标题】:Nested foreach loop inside for loop duplicates data returnedfor 循环内的嵌套 foreach 循环重复返回的数据
【发布时间】:2018-02-16 19:43:51
【问题描述】:

我有以下代码,无论我尝试了什么,我都无法让它只返回一次数据。

<div class="container">
    @for (int i = 0; i < Model.First().NumberOfRows; i++)
    {
        <div class="row">
        @foreach (var columns in Model)
        {

                <div class="@columns.BootstrapColumns">
                    @columns.BodyText
                </div>

            }
        </div>
    }

</div> 

我尝试在代码中放置一个计数器,移动代码在网上阅读帖子,但没有任何效果。

我是否遗漏了一些简单的东西,for 循环工作正常,但 foreach 导致了问题。

将 foreach 移到 for 循环之外,它可以正常工作,但我需要它在 for 循环内。

<div class="container">
        <div class="row">
                <div class="col-md-3">
                    <p>column 1</p>
                </div>
                <div class="col-md-3">
                    <p>column 2</p>
                </div>
                <div class="col-md-3">
                    <p>column 3</p>
                </div>
                <div class="col-md-3">
                    <p>column 4</p>
                </div>
                <div class="col-md-4">
                    <p>Row 2 column 1</p>
                </div>
                <div class="col-md-4">
                    <p>Row 2 Column 2</p>
                </div>
                <div class="col-md-4">
                    <p>Row 2 Column 3</p>
                </div>
                <div class="col-md-12">
                    <p>Rows 3 column 1</p>
                </div>
        </div>
        <div class="row">
                <div class="col-md-3">
                    <p>column 1</p>
                </div>
                <div class="col-md-3">
                    <p>column 2</p>
                </div>
                <div class="col-md-3">
                    <p>column 3</p>
                </div>
                <div class="col-md-3">
                    <p>column 4</p>
                </div>
                <div class="col-md-4">
                    <p>Row 2 column 1</p>
                </div>
                <div class="col-md-4">
                    <p>Row 2 Column 2</p>
                </div>
                <div class="col-md-4">
                    <p>Row 2 Column 3</p>
                </div>
                <div class="col-md-12">
                    <p>Rows 3 column 1</p>
                </div>
        </div>
        <div class="row">
                <div class="col-md-3">
                    <p>column 1</p>
                </div>
                <div class="col-md-3">
                    <p>column 2</p>
                </div>
                <div class="col-md-3">
                    <p>column 3</p>
                </div>
                <div class="col-md-3">
                    <p>column 4</p>
                </div>
                <div class="col-md-4">
                    <p>Row 2 column 1</p>
                </div>
                <div class="col-md-4">
                    <p>Row 2 Column 2</p>
                </div>
                <div class="col-md-4">
                    <p>Row 2 Column 3</p>
                </div>
                <div class="col-md-12">
                    <p>Rows 3 column 1</p>
                </div>
        </div>

Camilo Terevinto 如果我这样做,我会得到以下结果,这不是我所追求的

<div class="container">


<div class="row">

             <div class="col-md-3">
                 <p>column 1</p>
             </div>
         </div>
<div class="row">

             <div class="col-md-3">
                 <p>column 2</p>
             </div>
         </div>
<div class="row">

             <div class="col-md-3">
                 <p>column 3</p>
             </div>
         </div>
<div class="row">

             <div class="col-md-3">
                 <p>column 4</p>
             </div>
         </div>
<div class="row">

             <div class="col-md-4">
                 <p>Row 2 column 1</p>
             </div>
         </div>
<div class="row">

             <div class="col-md-4">
                 <p>Row 2 Column 2</p>
             </div>
         </div>
<div class="row">

             <div class="col-md-4">
                 <p>Row 2 Column 3</p>
             </div>
         </div>
<div class="row">

             <div class="col-md-12">
                 <p>Rows 3 column 1</p>
             </div>
         </div>


</div>

嗨 user7396598 我正在尝试让代码显示以下内容:

<div class="row">
<div class="col-md-4">row 1 col1</div>
<div class="col-md-4">row 1 col2</div>
<div class="col-md-4">row 1 col3</div>
</div>
<div class="row">
<div class="col-md-3">row 2 col1</div>
<div class="col-md-3">row 2 col2</div>
<div class="col-md-3">row 2 col3</div>
<div class="col-md-3">row 2 col4</div>
</div>
<div class="row">
<div class="col-md-12">row 3 col1</div>
</div>

我的 for 循环获取行数,然后 foreach 循环应该获取列并显示在行中的列中。

如果不首先使用 for 循环获取行数,我看不到任何其他方法。

=======================查看模型====================

public class NestedContentViewModel
    {
        public NestedContentViewModel() { }

        public NestedContentViewModel(int numberOfRows, HtmlString bodyText, string image, string imageAlternativeText,string rowBackgroundColour, string bootstrapColumns, int numberOfColumns)
        {
            NumberOfRows            = numberOfRows;
            BodyText                = bodyText;
            Image                   = image;
            ImageAlternativeText    = imageAlternativeText;
            RowBackgroundColour     = rowBackgroundColour;
            BootstrapColumns        = bootstrapColumns;
            NumberOfColumns         = numberOfColumns;
        }

        public int NumberOfRows             { get; set; }
        public int NumberOfColumns          { get; set; }
        public string BootstrapColumns      { get; set; }
        public HtmlString BodyText          { get; set; }
        public string Image                 { get; set; }
        public string ImageAlternativeText  { get; set; }
        public string RowBackgroundColour   { get; set; }
    }

==================控制器================

foreach (var rows in nestedContentRows)
                    {
                        int numberOfBootstrapColumns = rows.GetPropertyValue<IEnumerable<IPublishedContent>>("columns").Count();
                        string bootstrapColumn = "";

                        switch (numberOfBootstrapColumns)
                        {
                            case 1:
                                bootstrapColumn = "col-md-12";
                                break;
                            case 2:
                                bootstrapColumn = "col-md-6";
                                break;
                            case 3:
                                bootstrapColumn = "col-md-4";
                                break;
                            case 4:
                                bootstrapColumn = "col-md-3";
                                break;
                            default:
                                bootstrapColumn = "col-md-12";
                                break;
                        }

                        foreach (var columns in rows.GetPropertyValue<IEnumerable<IPublishedContent>>("columns"))
                        {
                            HtmlString bodyText = columns.HasValue("bodyText")? columns.GetPropertyValue<HtmlString>("bodyText"): new HtmlString(string.Empty);
                            model.Add(new NestedContentViewModel(numberOfRows: countNumberOfRows,bodyText: bodyText, image: null, imageAlternativeText: null,rowBackgroundColour: "cssTurquoiseBlue", bootstrapColumns: bootstrapColumn, numberOfColumns: numberOfBootstrapColumns));
                        }
                    }

【问题讨论】:

  • 您在每次迭代中循环整个模型,除了重复之外,您期望发生什么?完全删除@for
  • @Camilo Terevinto 我已根据您的建议更新了代码,但它不起作用,我已经尝试过了。
  • 您的模型由什么组成?期望的输出是什么?
  • @user7396598 我已经回答了你的问题
  • 请发布视图模型。我认为您正在循环错误的对象。

标签: c# asp.net-mvc razor


【解决方案1】:

所以,问题出在您的模型结构中。和命名约定,你的名字会引起各种混乱。目前,您的模型是您的 NestedContentViewModel 对象的列表,并且您正在为每个 BodyText 值创建一个新的 NestedContentViewModel。

您的 BodyText 实际上应该是每个 NestedContentViewModel 中的一个集合。这会将您的 BodyText(列信息)“关联”到 NestedContentViewModel(行)。另外,将 rowNumber 移出 NestedContentViewModel 并将其放在包含 List 的父级中

那么你的循环应该是这样的:

@foreach (var row in Model)
{
    <div class="row">
    @foreach (var column in row.ColumnCollection)
    {
            <div class="@row.BootstrapColumns">
                @column.BodyText
            </div>
        }
    </div>
}

我希望这能让您朝着正确的方向前进。如果您需要帮助重组模型,您可能需要编辑和清理问题文本。

【讨论】:

  • 谢谢,代码让我开始困惑,我现在更困惑:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-15
  • 1970-01-01
  • 2020-07-16
  • 2015-04-12
  • 2015-04-26
相关资源
最近更新 更多