从类型的字符串表示中动态生成特定类型的Enumerable对象

时间:2010-10-15 11:07:12

标签: asp.net-mvc reflection dynamic grid

我正在尝试在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 个答案:

答案 0 :(得分:1)

我真的不喜欢你想要做的事情的声音。为什么要将表转换为字符串?

转换为字符串的唯一时间是呈现视图的时间。在大多数情况下,应该留给MVC框架。

您提到的代码使用了HtmlTextWriter,这很好,因为它会直接呈现给响应。

然而,听起来好像是在尝试通过将所有内容呈现为字符串来重新发明轮子,而不是将其留在框架中。

请注意,在MVC中,视图只是渲染字符串的模板,如果我理解了你,那就是你需要的。

所以,如果我已经远程理解你想要做什么,并且它是一个很大的因为你的帖子不清楚,你应该通过你的类来查看作为强类型模型的一部分,然后写一些基本的将逻辑设计到视图中。

如果我是对的,这是不确定的,我认为你误解了MVC是如何工作的。

查看一些如何使用视图在模型中呈现数据的示例。模型可以是任何类,它可以是IEnumerable,列表,等等,你可以在视图中使用foreach循环来渲染你想要的东西,你想要它。

从这个意义上说,MVC与在普通的ASP.NET中编写自定义控件非常不同。

答案 1 :(得分:0)

感谢您回复awrigley。

要求很简单。我的帖子可能让它听起来非常复杂。

在Index视图中,我必须使用应用程序的所有系统查找表填充下拉列表。应用程序的“管理员”从下拉列表中选择一个项目,该项目应该在网格中显示该表格的竞争,以便管理员可以使用该网格执行CRUD操作。

我要做的是,将所选项目(即表格的名称)传递给控制器​​,控制器又将其传递给ViewModel类。这个类使用反射来调用(在我的原始问题中显示的代码)存储库的正确方法,该方法具有以下方法:

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

我遇到的问题是,当我调用该方法时,它会返回一个类型“object”,我无法将其转换为任何特定的类型,因为我不知道它应该转换为特定的类型。当此对象传递给视图时,网格期望IEnumerable或IEnumerable,但我不知道这些信息。我无法做到这一点:

(IEnumerable)method.Invoke(repositoryObject,null)

我得到:无法将IEnumerable转换为IEnumerable

我(有点)现在正在显示网格,但我在视图中使用了一个Switch语句:

开关(SLU_Type) { case“SLU_Table1”:Html.Grid((IEnumerable)Model.Items); case“SLU_Table2”:Html.Grid((IEnumerable)Model.Items); ..... }

我根本不喜欢这个,感觉不对,但我找不到合适的方式!

我可以为每个系统查找表提供部分视图,但为此我将需要添加大约30个部分视图,其中几乎完全相同的Action&amp;视图。这似乎也不正确!

希望这能让您更好地理解我想要实现的目标。