Как представить DataTable в виде бритвы MVC3 - PullRequest
2 голосов
/ 04 июля 2011

У меня есть надежный и проверенный метод импорта между электронной таблицей .xls [1], который возвращает DataTable. Я разместил это в своем слое службы, а не в данных, поскольку только рабочая книга сохраняется как загруженный файл, но теперь мне интересно, где и как создать HTML-представление этого DataTable. Я предпочел бы избежать двух петель на мой взгляд. У меня есть переменное количество столбцов в DataTable.

[1] Использование интерфейса OleDb. Я знаю, что это архаично, но это работает.

1 Ответ

15 голосов
/ 04 июля 2011

DataTables слабо типизированы.Я ненавижу слабую печать.

Вот альтернативный подход: использование моделей представлений, строго типизированных представлений и шаблонов отображения.Итак, начните с определения модели представления, которая будет представлять информацию, которую вы хотите отобразить:

public class MyViewModel
{
    public IEnumerable<ColumnViewModel> Columns { get; set; }
    public IEnumerable<RowViewModel> Rows { get; set; }
}

public class ColumnViewModel
{
    public string Name { get; set; }
}

public class RowViewModel
{
    public IEnumerable<CellValueViewModel> Values { get; set; }
}

public class CellValueViewModel
{
    public string Value { get; set; }
}

, тогда у вас может быть действие контроллера, которое заполнит эту модель представления.Если у вас уже есть несколько сервисных слоев, которые плюют в DataTables, вы можете сопоставить эти таблицы с вышеупомянутой моделью представления.Для этой демонстрации давайте жестко закодировать:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var model = new MyViewModel
        {
            Columns = new[] 
            { 
                new ColumnViewModel { Name = "column1" }, 
                new ColumnViewModel { Name = "column2" }, 
                new ColumnViewModel { Name = "column3" }, 
            },
            Rows = new[]
            {
                new RowViewModel 
                {
                    Values = new[] 
                    {
                        new CellValueViewModel { Value = "1x1" },
                        new CellValueViewModel { Value = "1x2" },
                        new CellValueViewModel { Value = "1x3" },
                    }
                },
                new RowViewModel 
                {
                    Values = new[] 
                    {
                        new CellValueViewModel { Value = "2x1" },
                        new CellValueViewModel { Value = "2x2" },
                        new CellValueViewModel { Value = "2x3" },
                    }
                },
                new RowViewModel 
                {
                    Values = new[] 
                    {
                        new CellValueViewModel { Value = "3x1" },
                        new CellValueViewModel { Value = "3x2" },
                        new CellValueViewModel { Value = "3x3" },
                    }
                }
            }
        };
        return View(model);
    }
}

, а последняя часть - это представление (~/Views/Home/Index.cshtml):

@model MyViewModel

<table>
    <thead>
        <tr>
            @Html.DisplayFor(x => x.Columns)
        </tr>
    </thead>
    <tbody>
        @Html.DisplayFor(x => x.Rows)
    </tbody>
</table>

и наши шаблоны отображения:

~/Views/Home/DisplayTemplates/ColumnViewModel.cshtml:

@model ColumnViewModel
<th>
    @Html.DisplayFor(x => x.Name)
</th>

~/Views/Home/DisplayTemplates/RowViewModel.cshtml:

@model RowViewModel
<tr>
    @Html.DisplayFor(x => x.Values)
</tr>

~/Views/Home/DisplayTemplates/CellValueViewModel.cshtml:

@model CellValueViewModel
<td>
    @Html.DisplayFor(x => x.Value)
</td>

И это почти все.Как вы можете видеть, мы написали ровно ноль циклов в наших представлениях, и мы получили красивую структуру <table>, представляющую таблицу Excel.

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