foreach数据互相翻转的地方

时间:2014-03-10 20:16:55

标签: c# razor asp.net-mvc-5

是否可以说:如果图像在左侧,则下一个应该在右侧,重复直到完成?

伪代码:

@foreach (var item in Model.Items)
{
    if (previous class=imageLeft)
    {
        <div class="imageRight">Right Image</div>
        <div>Left Content</div>
    }
    else
    {
        <div class="imageLeft">Left Image</div>
        <div>Right Content</div>
    }
}

2 个答案:

答案 0 :(得分:1)

是的,当然。你的伪代码几乎就在那里。只需使用变量来保存值,并记住在每次迭代中更新其值:

@int c = 0;
@foreach (var item in Model.Items)
{
    if (c == 0)
    {
        <div class="imageRight">Right Image</div>
        <div>Left Content</div>
        c = 1;
    }
    else
    {
        <div class="imageLeft">Left Image</div>
        <div>Right Content</div>
        c = 0;
    }
}

或者,您可以使用@foreach (int i = 0; i < Model.Items.Count; i++)循环,然后使用i % 2获取偶数/奇数行号,并根据需要应用该类。

答案 1 :(得分:0)

就个人而言,我会为此创建一个帮手。帮助程序保持代码清洁,使内循环更容易处理。一旦应用程序的大小增加,开始为您节省一些时间,特别是如果您复制一个工作示例。这是我的:

public class LooperHelper
{
    private int Iterations { get; set; } = 0;
    public void AddTick() {
        Iterations++;
    }
    public int GetTicks()
    {
        return Iterations;
    }
    public bool DivisibleBy(int divisor)
    {
        return (Iterations % divisor == 0);
     }
    public string ConditionalOutput(string stringoutput, int divisor, bool reverse = false)
    {
        return ((Iterations % divisor == 0) == !reverse ? stringoutput : "");
    }
}

这允许您根据迭代次数进行嵌套条件格式化:

var outerloophelper = new LooperHelper();
var innerloophelper = new LooperHelper();
foreach (var product in products)
{
    outerloophelper.AddTick();
    <div class="row @(outerloophelper.ConditionalOuput("alternative", 2, true))">
        @foreach (var subproduct in product.SubProducts)
        {
            innerloophelper.AddTick();
            <div class="4u@(innerloophelper.ConditionalOutput("$", 3)) 12u$(small)"> 
                 @subproduct.ToString()
            </div>
        }
    </div>
}

在上面的示例中,每个第二个产品都使用“alternative”类进行修饰(其中第一个标记为alternative,因为reverse设置为true)。嵌套的子产品项目进一步修饰,在类中添加了一个$符号,表示每三列的行更改。但是你也可以做其他漂亮的事情,例如确保在两者之间添加hr-tag,但不是在最后的循环元素之后,如下例所示:

@if (!outerloophelper.DivisibleBy(products.Count())) { <hr />}

简而言之,在初始化帮助程序时,它从0开始,并且在代码中定位AddTick()方法允许您调整迭代是以1还是0开始。

  • GetTicks()非常棒给你的结果编号,
  • DivisibleBy()返回一个布尔结果,您可以在自己的逻辑中使用它,
  • ConditionalOuput()将在语句保持时打印出文本。使用反向,以便在行不可分割时输出。