Как смешать HTML и C # код в MVC3 с Razor? - PullRequest
30 голосов
/ 12 июня 2011

Я пытаюсь отобразить список элементов, которые должны переключать класс для стилизации.Идея состоит в том, чтобы создать цикл foreach, который будет циклически проходить через все myObj в модели.

Я попробовал следующий код, который не работает (потому что я делаю это неправильно)

@{ int i = 2;
   foreach(var myObj in Model)
   {
        if (i % 2 == 0)
        {
            <div class="class1">
        }
        else
        {
            <div class="class2">
        }
        Html.Partial(...);
        </div>
         i += 1;
   }     
}

Как правильно это сделать?

Обновление
Я также попробовал следующий код, который, хотя и компилируется, не отображает HTML-код внутри (и яя уверен, что в Model есть объекты).

@{ int i = 2;
   foreach(var myObj in Model)
   {
        if (i % 2 == 0)
        {
            @:<div class="class1">
        }
        else
        {
            @:<div class="class2">
        }
        Html.Partial(...);
        @:</div>

        i += 1;
   }

}

Это частичный класс, называемый

<div class="class">
    <div class="class2">
        @if (string.IsNullOrEmpty(var))
        {
            @var2
        }
        else
        {
            @var
        }
    </div>
    <div class="class3">
        @var3
    </div>
</div>
<div class="class4">
    <p>var4</p>
    <ul class="class5">
        <li>element1</li>
        <li>element2</li>
    </ul>
</div>

Извините, я не могу опубликовать реальные имена и переменные.

Ответы [ 4 ]

27 голосов
/ 12 июня 2011

Давайте начнем с улучшения вашего кода.

  • Шаг улучшения 1:

    @foreach(var myObj in Model.Select((model, index) => new { model, index }))
    {
        <div class="class@(myObj.index % 2 == 0 ? "1" : "2")">
            @Html.Partial("_Foo", myObj.model)
        </div>
    }
    
  • Шаг 2 улучшения (с использованием специального помощника HTML для класса):

    @foreach(var myObj in Model.Select((model, index) => new { model, index }))
    {
        <div class="@Html.MyClass(myObj.index)">
            @Html.Partial("_Foo", myObj.model)
        </div>
    }
    

    где MyClass определяется следующим образом:

    public static string MyClass(this HtmlHelper html, int index)
    {
        return (index % 2 == 0) ? "class1" : "class2";
    }
    
  • Шаг 3 улучшения, который соответствует уровню техники (с использованием Tempulated Razor Delegates ):

    @Model.List(
        @<div class="@item.MyClass">
            @Html.Partial("_Foo", @item.Model)
        </div>
    )
    

    где метод расширения List выглядит следующим образом:

    public class ModelHolder<T>
    {
        public T Model { get; set; }
        public string MyClass { get; set; }
    }
    
    public static class RazorExtensions
    {
        public static HelperResult List<T>(
            this IEnumerable<T> items,
            Func<ModelHolder<T>, HelperResult> template
        )
        {
            return new HelperResult(writer =>
            {
                foreach (var item in items.Select((model, index) => new { model, index }))
                {
                    var myClass = item.index % 2 == 0 ? "class1" : "class2";
                    template(new ModelHolder<T> { Model = item.model, MyClass = myClass }).WriteTo(writer);
                }
            });
        }
    }
    

Я голосую за улучшение № 3, которое намного лучше и лаконичнее, чем оригинальный цикл foreach.

17 голосов
/ 12 июня 2011

Вам нужно поставить префикс строк с неправильно сформированными тегами с @:, чтобы Razor не пытался проанализировать теги.
Подробности .

7 голосов
/ 12 июня 2011

Вы можете быть уверены, что в какой-то модели есть объекты, но не ваша модель :) следующий пример кода, полученный непосредственно из вашего, работает просто отлично:


@{ int i = 2;
   string[] list = new string[] {"a","b","c","d"};
   foreach(var myObj in list)
   {
        if (i % 2 == 0){
            @:<div class="class1">
        }
        else
        {
            @:<div class="class2">
        }
        //Html.Partial(...);
        @:</div>
         i += 1;
   }     
}


0 голосов
/ 12 июня 2011

Вам необходимо написать @Html.Partial(...), чтобы отобразить результат на странице.

Вызов Html.Partial возвращает HelperResult с частичным представлением, но фактически не отображает его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...