我将数据库映射到实体框架,然后我有控制器,视图来显示那些表(实体)。我想创建一个通用视图来显示来自不同表的数据。
要显示一个表格,我有以下内容:
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
答案 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中设置的属性的名称
其他一切都应该是不言而喻的。