динамически генерировать перечислимый объект определенного типа из строкового представления типа - PullRequest
1 голос
/ 15 октября 2010

Я пытаюсь разработать решение в MVC, в котором строковое представление класса передается контроллеру, который затем должен построить сетку со всеми данными, принадлежащими этому классу в БД. (Я использую ORM для отображения классов в таблицы).

        //A method in the Model that populates the Item Property
    foreach (MethodInfo method in sDRMethods)
    {
        if (method.Name.Contains(_domainTable))
        {
            Items = method.Invoke(repositoryObject, null);
            break;
        }
    }

//View uses this Items property of the Model to populate the grid.
public object Items;

//_domainTable is the name of the table/class (in string format).
//repositoryObject is the object that has methods to return IEnumerable<class> collection object of each type.

Проблема, с которой я столкнулся, заключается в том, что я не знаю, как привести свойство «Items» в моем представлении, чтобы выполнить итерацию по нему и построить сетку.

Я пытался использовать "http://mvcsharp.wordpress.com/2010/02/11/building-a-data-grid-in-asp-net-mvc/", но общий метод расширения ожидает знать конкретный тип, с которым он должен работать.

Я бы предпочел использовать MVC, но, похоже, у меня не получится с этим сработать (в это очень трудно поверить).

Ответы [ 2 ]

1 голос
/ 15 октября 2010

Мне действительно не нравится звук того, что ты пытаешься сделать.Зачем преобразовывать таблицу в строку?

Единственный раз, когда вы преобразуете в строку, это когда представление отображается.И это, в большинстве случаев, должно быть оставлено на усмотрение MVC.

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

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

Обратите внимание, что в MVC представления являются просто шаблонами длярендеринг строк, который, если я вас понял, именно то, что вам нужно.

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

Если я прав, что не уверен, я думаю, что вы неправильно поняликак работает MVC.

Рассмотрим несколько примеров использования представлений для визуализации данных в модели.Модель может быть любым классом, это может быть IEnumerable, список и т. Д., И вы можете использовать циклы foreach в представлении, чтобы отобразить то, что вы хотите, как вы хотите.

В этом смысле MVCочень отличается от написания пользовательских элементов управления в простом ванильном ASP.NET.

0 голосов
/ 17 октября 2010

Спасибо за ваш ответ.

Требование довольно простое.Возможно, в моем посте это звучало очень сложно.

В представлении «Индекс» я должен заполнить раскрывающийся список всеми таблицами приложения, которые являются системными.«Администратор» приложения выбирает из выпадающего списка элемент, который должен отображать контексты этой таблицы в сетке, чтобы администратор мог выполнять операции CRUD с использованием этой сетки.

Что я пытаюсь сделать, это, передать выбранный элемент (который является именем таблицы) контроллеру, который, в свою очередь, передает его классу ViewModel.Этот класс использует отражение, чтобы вызвать (код, показанный в моем исходном вопросе) правильный метод репозитория, который имеет такие методы, как:

public IEnumerable GetAllTable1Data () {.....}

У меня проблема в том, что когда я вызываю метод, он возвращает тип «объект», который я не могу привести к чему-то конкретному, потому что я не знаю, к какому типу он должен быть приведен.Когда этот объект передается в представление, сетка ожидает IEnumerable или IEnumerable, но я не знаю эту информацию.Я не могу сделать это:

(IEnumerable) method.Invoke (repositoryObject, null)

Я получаю: не могу привести IEnumerable к IEnumerable

I (вид)у меня теперь отображается сетка, но я использую оператор Switch в представлении, которое выглядит следующим образом:

Switch (SLU_Type) {case "SLU_Table1": Html.Grid ((IEnumerable) Model.Items);case "SLU_Table2": Html.Grid ((IEnumerable) Model.Items);.....}

Мне это совсем не нравится, это неправильно, но я просто не могу найти приличный способ!

Я мог бы иметь частичные представления для каждого вида системыдо таблиц, но для этого мне нужно добавить около 30 частичных представлений с почти точно таким же кодом для Action & View.Это тоже не кажется правильным!

Надеюсь, это даст вам лучшее понимание того, чего я пытаюсь достичь.

...