【问题标题】:How to use one view/model in MVC3 with entity data modle to handle multiple tables?如何在 MVC3 中使用一个视图/模型和实体数据模型来处理多个表?
【发布时间】:2012-03-25 15:27:52
【问题描述】:

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

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

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 是一个对象集

【问题讨论】:

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


    【解决方案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 视图中进行操作。

    【讨论】:

    • 它也适用于 Razor 引擎视图。但是我遇到了一个新问题。在浏览器中每个页面的开头,它显示“System.Data.Objects.ObjectSet`1[Tablename] dynamic”。有谁知道为什么?我只使用了“@model 动态”
    • 已解决。这是由于自动完成“@Model dynamic”应该是“@model dynamic”
    【解决方案2】:

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

    @model 动态

    你可以把模型信息传入

    查看包

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

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

    【讨论】:

    • 我试过了。当我尝试使用 Model.first() 时,它生成了如下错误消息:System.Collections.Generic.List' does not contain a definition for 'First'。鉴于此,我使用了“dynamic myobjects = db.GetType().GetProperty(tablename).GetValue(db, null);”然后返回视图(myobjects)。在模型中,我使用了“@model dynamic”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-03
    • 2013-01-12
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    相关资源
    最近更新 更多