Как использовать одно представление / модель в MVC3 с модулем данных объекта для обработки нескольких таблиц? - PullRequest
0 голосов
/ 25 марта 2012

У меня есть база данных, сопоставленная с платформой сущностей, и затем у меня есть контроллеры, представления для отображения этих таблиц (сущностей). Я думаю создать одно общее представление для отображения данных из другой таблицы.

Для отображения одной таблицы у меня есть следующее:

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 ]

1 голос
/ 26 марта 2012

Я получил это прямо сейчас.

Ключ должен использовать страницу просмотра 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.

0 голосов
/ 26 марта 2012

Вы используете строго типизированные представления. Это не обязательно. Используйте динамически типизированное представление, и тогда вы будете в порядке с отображением данных таблицы на основе Reflection. По мнению

@ модель динамическая

Вы можете передать информацию о модели в

ViewBag

, что позволяет добавлять динамические свойства. Одним из свойств может быть ваш IEnumerable, где T - любая модель. Затем вы можете ссылаться на ViewBag.table (если это имя свойства, которое вы задали в Controller

все остальное должно быть самоочевидным.

...