视图中的通用类型

时间:2013-04-10 13:01:16

标签: asp.net asp.net-mvc c#-4.0 asp.net-mvc-4

我的目标:使用部分视图实现网格。所以我为Grid创建了一个类

我的代码

public class HomeController : Base_Controller
{
    //
    // GET: /Home/

    public ActionResult Index()
    {
        // return View("~/Views/Home/User/Login");
        if (System.Web.HttpContext.Current.User.Identity.IsAuthenticated)
        {
            var users = UserBL.GetAllUsers();
            Type type = users.FirstOrDefault().GetType();
            Models.Grid<DAL.Entities.User_Details> grid = new Models.Grid<DAL.Entities.User_Details>(users);

            ViewBag.GridData = grid;
            return View();
        }
        else
        {
            return RedirectToAction("Login", "User");
        }

        // return "Hellow";
    }
}

我的网格类是

public class Grid<T> 
{
    public Grid(object datasource)
    {

        Data = (List<T>)datasource;

    }

    public Grid()
    {

    }
    public List<T> Data
    {
        get;
        set;
    }


    public IEnumerable<System.Reflection.PropertyInfo> Props
    {
        get
        {
            return typeof(T).GetProperties().AsEnumerable();
        }

    }
}

我的观点代码是

   @using DAL.Entities;
@{
    ViewBag.Title = "Index";
}

<h1>welcome User....!</h1>
@{Models.Grid<User_Details> modelgrid = (Models.Grid<User_Details>)@ViewBag.GridData;}

@Html.Partial("GridView",modelgrid)

我的部分观点是这样的。在这个代码第一行有这里我想使用任何反射机制。任何人都可以将代码更改为可行的代码

    @model AC.Models.Grid<Need a solution here>

@if (Model != null)
{
    <table>
        <thead>
            <tr>
                @foreach (var col in Model.Props)
                {

                <td>@Html.Display(col.Name)</td> 

            }
        </tr>
    </thead>
    <tbody>
        @foreach (var item in Model.Data)
        {
            <tr>
                @foreach (var prop in Model.Props)
                {
                    <td>@Html.Display(prop.GetValue(item, null).ToString())</td>
                }
            </tr>
        }
    </tbody>



</table>

}

1 个答案:

答案 0 :(得分:3)

由于您已经在使用反射,因此在此处使用泛型并没有多大好处。怎么样:

public class Grid
{
    private readonly Type type;
    public Grid(IEnumerable datasource)
    {
        if (datasource == null)           
        {
            throw new ArgumentNullException("datasource");
        }

        this.type = datasource.GetType().GetGenericArguments().SingleOrDefault();

        if (this.type == null)
        {
            throw new ArgumentException("The datasource must be generic");
        }

        this.Data = datasource;
    }

    public IEnumerable Data { get; private set; }

    public IEnumerable<System.Reflection.PropertyInfo> Props
    {
        get
        {
            return this.type.GetProperties().AsEnumerable();
        }
    }
}

然后:

@model AC.Models.Grid

@if (Model != null)
{
    <table>
        <thead>
            <tr>
                @foreach (var col in Model.Props)
                {
                    <td>@Html.Display(col.Name)</td> 
                }
            </tr>
        </thead>
        <tbody>
            @foreach (var item in Model.Data)
            {
                <tr>
                    @foreach (var prop in Model.Props)
                    {
                        <td>@Html.Display(prop.GetValue(item, null).ToString())</td>
                    }
                </tr>
            }
        </tbody>
    </table>
}