Reputation: 33
I have database mapped into a entity framework and then I have controllers, views to display those tables(entities). I am thinking to create one generic view to display data from different table.
To display one table, I have the following:
public class ATaskController : Controller
{
private MY_DATA_SQLEntities db = new MY_DATA_SQLEntities();
//
// GET: /ATask/
public ViewResult Index()
{
return View(db.ATask.ToList());
}
}
In my view:
@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>
}
The above is only for one table and it works perfectly. But I have many tables, I don't want to create separate controller and view for each table. What I did is as follows:
In the view part, I changed to:
@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>
}
}
this works. But troubles are:
return View(db.ATask.ToList()); // in controller
and
@model IEnumerable<JRAM_MVC.ATask>
How could I make them dynamic so that they could handle different tables just by having their names ? e.g., I will get the table name in a string variable, and the program would dynamically create "return view(db.entityfortablename.ToList()) and in view "@model IEnumerable ?
JRAM_MVC.ATask is an ObjectSet
Upvotes: 0
Views: 3312
Reputation: 33
I got it right now.
The key is to use .aspx view page instead of Razor view engine and choose partial view.
In controller, I did the following:
public ActionResult ViewTable(string tablename)
{
dynamic myobjects = db.getType().getProperty(tablename).getValue(db, null);
return view(myobjects);
}
In view:
<%@ 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>
I am researching if it is possible to do in Razor view.
Upvotes: 1
Reputation: 127
You are using strongly typed views. This is not required. Use a dynamically typed view and then you should be ok with the Reflection based display of the table data. In the view
@model dynamic
you can pass the model information in
ViewBag
which allows you to add dynamic properties. One of the properties could be your IEnumerable where T is any model. You can then reference ViewBag.table (if that is the name of property that you set in the Controller
everything else should be self evident.
Upvotes: 0