2010-10-15 2 views
1

Я пытаюсь создать решение в 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, но похоже, что я не могу легко работать с этим (что очень сложно поверить).

+0

Есть ли еще код, который вы еще не разместили, а используете? – jfar

+0

Да, но я не думаю, что это важно. Недопустимый код - это «вызов» для метода, выполняющего вышеуказанный код. И представление, которое делает что-то вроде: – Aaron

+0

Switch (_domainTable) {case "systemLookUpTable1": return (IEnumerable ) Model.Items; ....} Мне действительно не нравится этот оператор switch в представлении! – Aaron

ответ

1

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

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

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

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

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

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

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

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

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

0

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

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

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

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

общественного IEnumerable GetAllTable1Data() { ..... }

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

(IEnumerable) method.Invoke (repositoryObject, нуль)

я: не могу бросить IEnumerable к IEnumerable

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

Switch (SLU_Type) { случай "SLU_Table1": Html.Grid ((IEnumerable) Model.Items); case "SLU_Table2": Html.Grid ((IEnumerable) Model.Items); ..... }

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

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

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

Смежные вопросы