Вопрос соответствия MVC XHTML - PullRequest
1 голос
/ 05 ноября 2008

У меня есть модель, заполняемая моим слоем данных, а затем у меня есть частичное представление, которое отображает экземпляр этой модели.

<li class="<%= td.Active ? "youarehere" : string.Empty %> <%= i == ViewData.Model.Count() - 1 ? "last" : string.Empty %>">

Проблема в том, что class="" является недопустимым XHTML, и мне потребуется более сложная логика для вывода атрибута класса. Что было бы правильным способом сделать это с помощью ASP.NET MVC. Должна ли логика жить в представлении или модели?

Я только начинаю с MVC и думаю, что я все еще пытаюсь понять, где именно провести линии, насколько я помещаю логику и каково допустимое количество логики для каждого слоя.

Ответы [ 3 ]

4 голосов
/ 05 ноября 2008

Я бы, вероятно, реализовал код для визуализации этого атрибута класса во вспомогательном методе. Либо один, специфичный для этой точки зрения, либо немного более общий. Таким образом, у вас будет меньше кода в вашем представлении, и он сможет решить, нужно ли даже отображать атрибут класса в случае, если нечего отображать.

1 голос
/ 05 ноября 2008

Дополнительной вещью для этого кода будет перенос вычислительной работы либо в контроллер, либо в код.

т.е. замена

<li <%= Html.GenerateAttribute("class", 
   () => string.Format("{0} {1}", td.Active 
     ? "youarehere" : string.Empty, 
   i == ViewData.Model.Count() - 1 
     ? "last" : string.Empty)) %>>

с чем-то вроде

<%= Html.ListItem( ViewData.Model.Value, 
       GetItemCssClass(i, ViewData.Model.Count()) ) %>

и GetItemCssClass могут быть в коде позади.

0 голосов
/ 05 ноября 2008

Хорошо, поэтому, основываясь на мнениях Фила, это то, что я сделал. Оно работает. Пожалуйста, добавьте комментарий, если есть какие-либо полезные отзывы.

  1. Я создал метод расширения HtmlHelper под названием GenerateAttribute.

    public static string GenerateAttribute(this HtmlHelper hh,
                                           string name,
                                           Func<string> valueFunc)
    { 
        string value = valueFunc().Trim();
        if (!string.IsNullOrEmpty(value))
            return string.Format("{0}=\"{1}\"", name, value);
        return string.Empty;
    }
    
  2. Из моего представления я вызываю Html.GenerateAttribute, передавая ему лямбда-выражение, которое генерирует значение. Затем метод GenerateAttribute вернет полный атрибут (name = "val"), если значение не является string.Empty.

    <li <%= Html.GenerateAttribute("class", () => string.Format("{0} {1}", td.Active ? "youarehere" : string.Empty, i == ViewData.Model.Count() - 1 ? "last" : string.Empty)) %>>
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...