TheRedEye Ответов: 3

Asp.net MVC как отобразить динамические столбцы


Исходя из веб-форм, я все еще совершенно новичок в этом деле. ASP.net MVC.

У меня есть потребность отобразить HTML-таблицу, в которой столбцы неизвестны во время разработки. У меня есть следующие две таблицы MS SQL, которые обозначают, какие столбцы будут отображаться во время выполнения.

CREATE TABLE ActualData (
	Col1 int,
	Col2 int,
	Col3 int,
	Col4 int
)
INSERT INTO ActualData (Col1, Col2, Col3, Col4) VALUES (1, 2, 3, 4)

CREATE TABLE ColumnsToShow (
	UserID int,
	ColName varchar(10)
)
INSERT INTO ColumnsToShow(UserID, ColName) VALUES (1, 'Col1')
INSERT INTO ColumnsToShow(UserID, ColName) VALUES (1, 'Col2')
INSERT INTO ColumnsToShow(UserID, ColName) VALUES (2, 'Col3')
INSERT INTO ColumnsToShow(UserID, ColName) VALUES (2, 'Col4')

Так что представление показывает только фактические данные.Col1 и ActualData.Col2 пользователю 1, а также
ActualData.Col3 и ActualData.Col4 для пользователя 2.

Я знаю, что в webforms я бы, вероятно, сделал что-то вроде этого, чтобы удалить соответствующие столбцы перед привязкой datatable к элементу управления GridView.
DataTable dtData = GetActualData(); // db call
List<string> colsToRemove = GetColumnsToRemove(); // db call returning only the fields to remove
// remove columns not neccessary for the current user
foreach (string colName in colsToRemove)
   foreach (DataColumn dc in dtData.Columns)
      if (dc.ColumnName == colName)
         dtData.Columns.Remove(colName);

// bind the datatable to a GridView
gridview.AutoGenerateColumns = true;
gridview.DataSource = dtData;
gridview.DataBind();

Новичок в MVC, я действительно даже не знаю, с чего начать. Так что любой совет будет оценен по достоинству.

Что я уже пробовал:

Я еще ничего не пробовал, так как Ищу идею, с чего начать.

3 Ответов

Рейтинг:
20

Richard Deeming

Вы, вероятно, захотите использовать помощник WebGrid[^]:

WebGrid in ASP.NET MVC4[^]
WebGrid in ASP.NET MVC[^]
Окончательная Поваренная книга для ASP.NET MVC WebGrid | DanylkoWeb[^]

К сожалению, вам нужно будет определить столбцы, так как WebGrid похоже, что он не может автоматически генерировать столбцы для a DataTable или DataView Но это не так уж и сложно:

var columns = new List<WebGridColumn>(dtData.Columns.Count);
foreach (DataColumn column in dtData.Columns)
{
    columns.Add(new WebGridColumn
    {
        ColumnName = column.ColumnName,
        Header = column.Caption,
    });
}

ViewBag.Columns = columns;
return View(dtData);

Тогда, на ваш взгляд,:
@model DataTable

@{
    var grid = new WebGrid(Model);
}

@grid.GetHtml(columns: ViewBag.Columns)


Кроме того, вы можете конвертировать свой DataTable к списку динамических объектов, как описано в разделе этот ответ StackOverflow[^].
var model = new List<dynamic>(dtData.Rows.Count);

foreach (DataRow row in dtData.Rows)
{
    var obj = (IDictionary<string, object>)new ExpandoObject();
    
    foreach (DataColumn col in dtData.Columns)
    {
        obj.Add(col.ColumnName, row[col]);
    }
    
    model.Add(obj);
}

return View(model);

Тогда, на ваш взгляд,:
@model IList<dynamic>

@{
    var grid = new WebGrid(Model);
}

@grid.GetHtml()


Рейтинг:
1

Member 13953412

я хочу динамично агригировать колонну


CHill60

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

Рейтинг:
0

TheRedEye

Спасибо, Ричард. Я использовал версию динамического списка.
Работает как заклинание :-)