0

我有數據庫映射到一個實體框架,然後我有控制器,視圖來顯示這些表(實體)。我正在考慮創建一個通用視圖來顯示來自不同表格的數據。如何使用MVC3中的一個視圖/模型和實體數據模型來處理多個表?

要顯示一個表,我有以下幾點:

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是一個對象集

回答

0

您正在使用強類型的意見。這不是必需的。使用動態類型視圖,然後您應該確定表數據的基於反射的顯示。在視圖

@model動態

你可以通過在

ViewBag

,它允許你添加動態屬性的模型信息。其中一個屬性可能是您的IEnumerable,其中T是任何模型。然後,您可以參考ViewBag.table(如果這是您在控制器設置的屬性名

一切應該是不言自明的。

+0

我試過了。它生成如下錯誤消息:當我嘗試使用Model.first()時,System.Collections.Generic.List '不包含'First'的定義。鑑於此,我使用了「動態myobjects = db.GetType()」。GetProperty(tablename).GetValue(db,null);「然後返回視圖(myobjects)在模型中,我使用了」@model dynamic「 – 2012-03-26 02:06:34

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> 

我在研究是否可以在剃刀視圖中執行操作。

+0

它也可以在Razor引擎視圖中工作,但是我遇到了一個新問題。每個頁面在瀏覽器中顯示「System.Data.Objects.ObjectSet'1 [Tablename] dynamic」。任何人都知道爲什麼?我只使用「@model dynamic」 – 2012-03-26 04:05:38

+0

解決。它是由於自動完成「@Model dynamic」應該是「@model dynamic」 – 2012-03-26 04:19:49

相關問題