Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 3 ASP.NET MVC3 WebGrid帮助程序和模型元数据_Asp.net Mvc 3_Modelmetadata_Webgrid - Fatal编程技术网

Asp.net mvc 3 ASP.NET MVC3 WebGrid帮助程序和模型元数据

Asp.net mvc 3 ASP.NET MVC3 WebGrid帮助程序和模型元数据,asp.net-mvc-3,modelmetadata,webgrid,Asp.net Mvc 3,Modelmetadata,Webgrid,我正在尝试使用ASP.NET MVC 3中的WebGrid html帮助程序根据ModelMetadata中的信息自动生成列。例如,接受对象列表的视图中的代码为: var grid = new WebGrid(Model); @grid.GetHtml(columns: ViewData.ModelMetadata.Properties.Single.Properties .Select(p => grid.Column(

我正在尝试使用ASP.NET MVC 3中的WebGrid html帮助程序根据ModelMetadata中的信息自动生成列。例如,接受对象列表的视图中的代码为:

var grid = new WebGrid(Model);
@grid.GetHtml(columns: ViewData.ModelMetadata.Properties.Single.Properties
               .Select(p => grid.Column(
                       columnName: p.PropertyName,
                       header: p.ShortDisplayName
               )));
这实际上就像一个符咒(我很惊讶它竟然这么简单)。这里发生的事情是,从模型的属性中,我使用ShortDisplayName作为列的标题

问题出在哪里?我需要对所有列应用默认格式。基本上,我希望对网格将显示的所有数据使用Html.Raw扩展名。一次尝试是这样的:

var grid = new WebGrid(Model);
@grid.GetHtml(columns: ViewData.ModelMetadata.Properties.Single.Properties
               .Select(p => grid.Column(
                       columnName: p.PropertyName,
                       header: p.ShortDisplayName,
                       format: (item) => Html.Raw(GetPropertyValue(item, p.PropertyName))
               )));
其中,GetPropertyValue方法将使用反射或其他方式读取属性的值(我需要在此提醒,项是动态的,其值实际上是当前行中显示的对象)

有没有更好的办法

谢谢


Kostas

我建议您研究一下MVCContrib网格项目:

不知道您在这个问题上是否还需要一些帮助,但我遇到了一个和您一样的问题,这就是我为解决这个问题所做的:

  • 我使用Foreach循环迭代属性
  • 用属性的名称填充变量
  • 格式化列
  • 我得到的代码是这样的:

    var columns = List<WebGridColumn>();
    foreach (var p in ViewData.ModelMetadata.Properties.Single.Properties) {
       String propertyName = p.PropertyName;
       columns.Add(grid.Column(p.PropertyName, p.ShortDisplayName, format: item => Html.Raw(GetPropertyValue(item.Value, propertyName))));
    }
    @grid.GetHtml(columns: columns.ToArray());
    
    我真的不知道这是否是最好的方法,但它对我来说非常有效

    public static object GetPropertyValue(object obj, String propertyName)
    {
        if (propertyName.Contains("."))
        {
            int index = propertyName.IndexOf(".");
            object prop = obj.GetType().GetProperty(propertyName.Substring(0, index)).GetValue(obj, null);
            return GetPropertyValue(prop, propertyName.Substring(index + 1));
        }
    
        return obj.GetType().GetProperty(propertyName).GetValue(obj, null);
    }