【问题标题】:Generic type in Views视图中的通用类型
【发布时间】:2013-04-10 13:01:16
【问题描述】:

我的目标:实现带有部分视图的网格。所以我为 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>

}

【问题讨论】:

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


    【解决方案1】:

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

    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>
    }
    

    【讨论】:

    • IEnumarable 是接口权。它需要 IEnumarable。假设您将其更改为 Enumarable。那么我们如何获取返回 typeof(T).GetProperties().AsEnumerable(); 的属性以及我们如何将数据分配给 list 到 Enumarable
    • 错误使用泛型类型 'System.Collections.Generic.IEnumerable' 需要 1 个类型参数
    • 您在哪一行收到此错误?顺便说一句,我对我的答案做了一个小修正:private readonly Type type { get; set; } 应该是 private readonly Type type;
    • 我们在哪里使用 IEnumarable。因为语法是 IEnumarable 。我们没有给出数据类型 T
    • 我看不到您在代码中的何处使用它。但是你可以在任何你使用它的地方将它转换为底层类型:Data.Cast&lt;User_Details&gt;()...
    猜你喜欢
    • 2017-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-28
    • 2011-06-10
    • 2013-04-23
    相关资源
    最近更新 更多