Цикл по переменным

171
02 января 2019, 15:30

Что есть:

@{
    int Ach1 = 3;
    int Ach2 = 300;
    int Ach3 = 500000;
}
@{ Ach1++; }@Ach1

Всё просто, получаем на выходе 4. А как быть если мне нужно перебирать их? То есть по сути мне нужно прибавлять единичку не =3, а к int Ach1 и получить int Ach2, int Ach3 и так далее. Нужно генерировать эти данные из массива в 1 блок представления, а не плодить их кучу в представлении.

Собственно сам блок:

<div class="col-md-6">
    <div class="well well-sm">
        <div class="row">
            <div class="col-xs-3 col-md-3 text-center">
                <img src="~/images/ach/Ach1.png" alt="Ach"
                     class="img-rounded img-responsive" />
            </div>
            <div class="col-xs-9 col-md-9 section-box">
                <span class="ach-title-size">
                    Заголовок
                    @if (@info.Ach1 >= @Ach1 / 3)
                    {
                        <span class="pull-right glyphicon glyphicon-star text-warning"></span>
                    }
                    else
                    {
                        <span class="pull-right glyphicon glyphicon-star-empty text-warning"></span>
                    }
                    @if (@info.Ach1 >= @Ach1 / 3 * 2)
                    {
                        <span class="pull-right glyphicon glyphicon-star text-warning"></span>
                    }
                    else
                    {
                        <span class="pull-right glyphicon glyphicon-star-empty text-warning"></span>
                    }
                    @if (@info.Ach1 >= @Ach1)
                    {
                        <span class="pull-right glyphicon glyphicon-star text-warning"></span>
                    }
                    else
                    {
                        <span class="pull-right glyphicon glyphicon-star-empty text-warning"></span>
                    }
                </span>
                <p class="ach-text-size">
                    Инфо
                </p>
                @if (@info.@Ach1 >= Ach1)
                {
                    <dt class="text-warning">Выполнено!</dt>
                    ach_status = "completed";
                    <span>@ach_status</span>
                }
                else
                {
                    ach_status = "uncompleted";
                    <span class="pull-right ach-text-size">
                        @info.Ach1<span>/</span>@Ach1
                    </span>
                    <div class="row rating-desc">
                        <div class="col-md-12">
                            <div class="ach-progress">
                                <progress max="@Ach1" value="@info.Ach1">
                                </progress>
                            </div>
                        </div>
                    </div>
                }
            </div>
        </div>
    </div>
</div>

Кому не сложно, набросайте пожалуйста верный пример в консольке, или толкните в нужное русло. Спасибо!

По ходу решения вопроса - назрела более серьёзная сложность:

Как быть с базой тут же) Вот пример:

@foreach (Web.Models.DataBase.Achievements info in ViewBag.info) 
{ 
@if @info.Ach1 >= @Ach1 / 3) 
<span class="pull-right glyphicon glyphicon-star text-warning">
</span> 
}

В табличке базы данных Achievements все строки так же по порядку. Начиная с Ach1 и заканчивая Ach50. Собственно так же любопытно, на сколько это реально?

Answer 1

Это можно реализовать вот таким образом.

  1. Добавьте Partial View. Например, \Views\Shared\_Achievement.cshtml.
  2. Перенесите разметку для Achievement в Partial View, а в самой вьюхе отобразите Partial View используя метод Html.Partial и передавайте ей экземпляр Achievement через Model.

    @foreach (Web.Models.DataBase.Achievements info in ViewBag.info)
      <div class="col-md-6">
        <div class="well well-sm">
          <div class="row">
            @Html.Partial("_Achievement", info)
          </div>
        </div>
      </div>
    }
    /**/
  3. В _Achievement.cshtml используйте ViewData.ModelMetadata.Properties, чтобы перечислить все свойства и вывести их на экран.

    @{
      Dictionary<string, int> Achs = new Dictionary<string, int>() {
        { "Ach1", 3 },
        {"Ach2", 300 },
        {"Ach3", 500000 }
        };
      string ach_status;
    }
    @foreach (ModelMetadata property in ViewData.ModelMetadata.Properties) {
      if (property.PropertyName.StartsWith("Ach")) {
        <div class="col-xs-3 col-md-3 text-center">
          <img src="@string.Format("~/images/ach/{0}.png", property.PropertyName)" alt="Ach"
             class="img-rounded img-responsive" />
        </div>
        <div class="col-xs-9 col-md-9 section-box">
          <span class="ach-title-size">
            Заголовок
            @if ((int)property.Model >= Achs[property.PropertyName] / 3) {
              <span class="pull-right glyphicon glyphicon-star text-warning"></span>
            } else {
              <span class="pull-right glyphicon glyphicon-star-empty text-warning"></span>
            }
            @if ((int)property.Model >= Achs[property.PropertyName] / 3 * 2) {
              <span class="pull-right glyphicon glyphicon-star text-warning"></span>
            } else {
              <span class="pull-right glyphicon glyphicon-star-empty text-warning"></span>
            }
            @if ((int)property.Model >= Achs[property.PropertyName]) {
              <span class="pull-right glyphicon glyphicon-star text-warning"></span>
            } else {
              <span class="pull-right glyphicon glyphicon-star-empty text-warning"></span>
            }
          </span>
          <p class="ach-text-size">
            Инфо
          </p>
          @if ((int)property.Model >= Achs[property.PropertyName]) {
            <div class="text-warning">Выполнено!</div>
            ach_status = "completed";
            <span>@ach_status</span>
          } else {
            ach_status = "uncompleted";
            <span class="pull-right ach-text-size">
              @property.Model<span>/</span>@Achs[property.PropertyName]
            </span>
            <div class="row rating-desc">
              <div class="col-md-12">
                <div class="ach-progress">
                  <progress max="@Achs[property.PropertyName]" value="@((int)(int)property.Model)">
                  </progress>
                </div>
              </div>
            </div>
          }
        </div>
      }
    }
Answer 2

Если я верно понял, у вас есть наборы переменных Arch1 ... Arch50 и вам надо их как то положить в массив, чтобы завернуть какую то конструкцию в цикл вместо того, чтобы её 50 раз повторять в коде.

Приведу небольшой пример. Допустим, у нас есть переменные

int Ach1 = 3;
int Ach2 = 300;
int Ach3 = 500000;

Мы можем их положить в массив вот так

int[] array = new int[] {Ach1, Ach2, Ach3};

После этого можем пройтись по ним циклом

foreach (var ach in array)
{
    Console.WriteLine(ach);
}   

Вывод, как ожидается

3
300
500000
READ ALSO
Парсинг типа данных PointF

Парсинг типа данных PointF

Добрый день!Мне необходимо пропарсить PointFМетод Parse не подходит

174
Переменные и база данных с локализацией

Переменные и база данных с локализацией

Я новичокЕсть следующий код:

169
Скажите как правильно подключить две ViewModel

Скажите как правильно подключить две ViewModel

Всем здравствуйтеЕсть у меня TabControl с двумя вкладками

184
Как проверить отключен ли callback?

Как проверить отключен ли callback?

Один умелец выложил в общий доступ код, позволяющий отключить event AssemblyLoad

199