如何在MVC 3中使用一个视图/模型与实体数据模型来处理多个表?

时间:2012-03-25 15:27:52

标签: asp.net-mvc-3 model-view-controller dynamic model dynamic-data

我将数据库映射到实体框架,然后我有控制器,视图来显示那些表(实体)。我想创建一个通用视图来显示来自不同表的数据。

要显示一个表格,我有以下内容:

public class ATaskController : Controller
{
    private MY_DATA_SQLEntities db = new MY_DATA_SQLEntities();


    //
    // GET: /ATask/

    public ViewResult Index()
    {

        return View(db.ATask.ToList());
    }
}

在我看来:

@model IEnumerable<JRAM_MVC.ATask>

@foreach (var item in Model) {
<tr>
    <td>
        @Html.DisplayFor(modelItem => item.name)
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.position)
    </td>
    <td>
        @Html.ActionLink("Edit", "Edit", new { id=item.ID }) |
        @Html.ActionLink("Details", "Details", new { id=item.ID }) |
        @Html.ActionLink("Delete", "Delete", new { id=item.ID })
    </td>
 </tr>
}

以上仅适用于一张桌子而且效果很好。但我有很多表,我不想为每个表创建单独的控制器和视图。我所做的如下:

在视图部分,我改为:

@model IEnumerable<JRAM_MVC.ATask>

@*foreach (var item in Model)
{
<tr>
        @{
Type t = item.GetType();
foreach (PropertyInfo k in t.GetProperties())
{
    <td>@t.GetProperty(k.Name).GetValue(item,null)</td>
}

}
这是有效的。但麻烦是:

return View(db.ATask.ToList()); // in controller

@model IEnumerable<JRAM_MVC.ATask>

我怎样才能让它们变得动态,以便只需拥有自己的名字即可处理不同的表格?例如,我将在字符串变量中获取表名,程序将动态创建“返回视图(db.entityfortablename.ToList())并在视图中”@model IEnumerable?

JRAM_MVC.ATask是一个ObjectSet

2 个答案:

答案 0 :(得分:1)

我现在就明白了。

关键是使用.aspx视图页而不是Razor视图引擎并选择局部视图。

在控制器中,我做了以下事情:

public ActionResult ViewTable(string tablename)
{

dynamic myobjects = db.getType().getProperty(tablename).getValue(db, null);

return view(myobjects);
}

在视图中:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<dynamic>" %>

<table>

<% foreach (var item in Model) { %>
<tr>
   <% Type t = item.GetType();
foreach (System.Reflection.PropertyInfo k in t.GetProperties())
{
    %>
    <td><%:@t.GetProperty(k.Name).GetValue(item,null)%></td>
<% } %>
</tr>


<%} %>

</table>

我正在研究是否可以在Razor视图中进行。

答案 1 :(得分:0)

您正在使用强类型视图。这不是必需的。使用动态类型视图然后您应该可以使用基于反射的表数据显示。在视图中

@model dynamic

您可以在

中传递模型信息

ViewBag

允许您添加动态属性。其中一个属性可能是你的IEnumerable,其中T是任何模型。然后,您可以引用ViewBag.table(如果这是您在Controller中设置的属性的名称

其他一切都应该是不言而喻的。