Мне нужно отобразить все поля списка dto в razorpage. У меня есть около 70 полей каждого объекта dto.
теперь у меня есть такой код:
@foreach (var ft in Model.DtoForeignClients)
{
<tr>
<td>@ft.Name</td>
<td>@ft.Head</td>
<td>@ft.Customer</td>
<td>@ft.Item</td>
//~66 another fields
</tr>
это работает, но я хочу улучшить свой код. я хочу к чему-то:
@foreach (var ft in Model.DtoForeignClients)
{
<tr>
@for (int i = 0; i<ft.CountOfFields;i++)
<td>@ft[i]</td>
</tr>
потому что я не хочу повторять около 70 раз.
Как я могу это сделать? Должен ли я изучить реализацию IEnumerable для моего DTO? или любые другие идеи, спасибо
Это довольно широкий вопрос. Каждый компонент сетки делает это с помощью отражения. Однако отражение стоит дорого, поэтому они заботятся о том, чтобы сделать это максимально эффективным способом, кэшируя информацию о типе и т. д. Если вам В самом деле нужна сетка с открытым концом, DataTable как DTO, вероятно, является лучшим выбором. Еще один вариант — использовать сетку Javascript, которая загружает данные из конечной точки HTTP API, например, контроллера веб-API. Легче найти высококачественные сетки JavaScript бесплатно.
@PanagiotisKanavos мне нужно сделать это с помощью С#, потому что у меня есть другие места в моем коде, где мне нужно улучшить такую логику (бизнес-уровень)
Если вы настаиваете на динамическом доступе к свойствам, у вас есть проблемы со ссылкой от Мустафы Ларроуча?
Используйте отражение в своем представлении, чтобы получить FieldInfo[] объекта. Замените DtoForeignClient
своим реальным типом ft
.
@using System.Reflection;
@{
var fields = typeof(DtoForeignClient).GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
}
@foreach (var ft in Model.DtoForeignClients)
{
<tr>
@foreach(FieldInfo f in fields)
{
<td>@f.GetValue(ft)</td>
}
<tr>
}
Возможный дубликат Заголовки и представления Razor ASP.NET MVC для каждого столбца динамически