K.A.D.
K.A.D.

Reputation: 3718

ASP.NET MVC generic view for displaying data

I am working on a project involves exposing many data entities (more than 200) through an ASP.NET MVC application. I do not want to write views for every entity mode and I am wondering if there is a way of having one generic view to display different models (for example, a view which reads the model properties(metadata) and generates a HTML table to display a list of entities.

Upvotes: 1

Views: 2759

Answers (3)

queen3
queen3

Reputation: 15501

If you only need to display, you can write your own generic renderer in few minutes using reflection. Or, you can use ModelVisualizer from MvcContrib, or Grid from MvcContrib which can do Html.Grid(Model).AutoGenerateColumns() to automatically show properties as columns. It doesn't support DataAnnotations or attributes, but you can write your own extension method that will use reflection to generate Grid's columns based on some attributes. And you can quickly turn this grid into jqGrid using jqGrid's tableToGrid() method.

If you need input support, there're several choices:

  1. MvcContrib's InputBuilder (here you can see a simple example on how it's done with reflection)
  2. MVC v2 InputFor(), I think it supports rendering several properties, but I'm not sure.
  3. My solution does read metadata (attributes) from view models and generates jqGrid formatting and editing options automatically.

There should be commercial tools, too.

Upvotes: 4

Mathias F
Mathias F

Reputation: 15891

MVC Contrib has Model Visualizer which let you display a Model by reflecting its properties. That a no go if you need any performance at all, but maybe it gets you started.

Upvotes: 0

Robert Koritnik
Robert Koritnik

Reputation: 105019

Two choices:

Dynamic Data Project

Have you tried Asp.net Dynamic data project that can automagically create what you need?

Asp.net MVC

But if you want to do what you're asking, you can always create a single view that will not have a strong type model. You will always pass data to it ViewData dictionary. The view would then parse that data and display what's required.

Routing
You can always create these two routes:

routes.MapRoute(
    "EntityRoute",
    "{entityName}",
    new {
        controller = "Entity",
        action = "Display",
        entityName = "SomeDefaultEntity" }
);

routes.MapRoute(
    "EntityRoute",
    "{entityName}/{recordId}",
    new {
        controller = "Entity",
        action = "Details",
        entityName = "SomeDefaultEntity",
        recordId = string.Empty }
);

that will redirect all requests to the same controller action that will provide correct entity set data and pass it into the ViewData dictionary and return the view that will consume it. The second one will display details of a certain record within some entity (in case you need to provide master/details functionality).

Upvotes: 2

Related Questions