ASP.NET MVC: частичное представление для отображения части таблицы - PullRequest
2 голосов
/ 18 апреля 2011

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

Таблица 1

Column A   |   Column B
1          |   2
4          |   8

Таблица 2

Column A   |   Column B   |   Column C
1          |   2          |   7
4          |   8          |   2

Очевидно, что мои настоящие таблицы намного сложнее, чем в приведенном выше примере, который только усугубляет проблему. Из-за того, как таблицы написаны на HTML, мне кажется, что нет хорошего способа вырезать то, что я хочу использовать повторно, при этом имея возможность добавлять к нему.

Используя таблицы, можно ли использовать методы для повторного использования кода или мне придется отказаться от использования таблиц?

Ответы [ 3 ]

4 голосов
/ 18 апреля 2011

Почему бы просто не создать представление, которое специализируется на построении таблицы с учетом конкретной модели, которая включает всю информацию о столбцах и строках?Таким образом, вы можете использовать вид в любом месте, и модель, которую вы дадите, будет определять количество столбцов и строк.

Редактировать

Не думаю, что вы достаточнопонимая мою точку зрения, поэтому я буду использовать некоторый код.Сейчас у вас, вероятно, есть модель, которая выглядит примерно так:

public class Something
{
    public string ValueA {get;set;}
    public string ValueB {get;set;}
    public string ValueC {get;set;}
}

И ваш взгляд, вероятно, выглядит примерно так:

<table><tr><th>Column A</th><th>Column B</th><th>Column C</th></tr>
    <%foreach(var something in Model.Somethings) {%>
       <tr>
           <td><%:something.ValueA%></td>
           <td><%:something.ValueB%></td>
           <td><%:something.ValueA%></td>
       </tr>
    <%}%>
</table>

Ну, как вы заметили, это не такХорошо поддается просто столбцам из таблицы.Одним из решений было бы установить некоторые параметры в модуле, чтобы определить, какие столбцы будут включены, и затем добавить в ваш набор кучу операторов if/then.Но я думаю, что лучшим решением было бы создать новый класс Model, который будет выглядеть примерно так:

public class TableModel
{
    public IEnumerable<string> Headers {get;set;}
    public IEnumerable<IEnumerable<string>> Rows {get;set;}
}

Тогда ваша модель будет выглядеть примерно так:

<table><tr>
    <%foreach(var header in Model.Headers) {%>
        <th><%:header%></th>
    <%}%></tr>
    <%foreach(var row in Model.Rows) {%>
       <tr>
       <%foreach(var cell in row) {%>
           <td><%:cell%></td>
        <%}%>
       </tr>
    <%}%>
</table>

Как вы можете видетьВ этом коде представления нет ничего, что явно связывало бы вас с вашим исходным типом данных, поэтому его можно использовать повторно для любой таблицы, которую вы хотите создать во всем приложении.Ваш контроллер становится ответственным за создание объекта TableModel из данных, которые вы хотите представить.Если в эту модель будет включен определенный столбец, он будет отображен.Если нет, то не будет.

Очевидно, что, как и в вашем примере, это чрезвычайно упрощено, но оно должно дать вам общее представление.Класс DataTable, который уже является частью .NET, может уже иметь все необходимое, поэтому вам даже не придется создавать свой собственный класс TableModel.У него уже есть приятная функциональность, связанная с добавлением и удалением столбцов, строк и т. Д.

0 голосов
/ 18 апреля 2011

Попробуйте подумать о проблеме в два этапа.Один генерирует заголовки и захватывает нужные вам столбцы, другой фактически отображает HTML.Затем вы можете вызвать метод, подобный

RenderTable( string[] columnsINeed )

, который отобразит нужные вам столбцы таблицы.

Способ отображения HTML не должен препятствовать написанию кода для повторного использования.

0 голосов
/ 18 апреля 2011

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

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