ASP NET MVC 剑道网格和列名

Posted

技术标签:

【中文标题】ASP NET MVC 剑道网格和列名【英文标题】:ASP NET MVC kendo grid and column name 【发布时间】:2014-02-19 20:40:03 【问题描述】:

我有带有字段的 sql 表: ID、字段 1、字段 2、字段 3、字段 4、字段 5 我还有其他带有列的表 f1,f2,f3,f4,f5 此表只有一行包含以下数据: 代码、供应商、型号、年份、价格

我的项目中有这个模型

public class Products

  [ScafoldColumn(false)]  
  public Guid Idget;set;
  public string Field1get;set;
  public string Field2get;set;
  public string Field3get;set;
  public string Field4get;set;
  public string Field5get;set;

而且我希望我的剑道网格显示列标题不像 Field1... 但与表 2 中的数据类似(代码、供应商、型号、年份、价格) 如何从表中加载这些数据并设置为剑道网格列标题?

【问题讨论】:

【参考方案1】:

我不确定您的要求是否可以完成。但是 Kendo Grid 有一个 title 属性,所以你可以随意设置 Header。

@(html.Kendo().Grid<OMSWeb.Models.OrderGridViewModel>()
 .Name("grid")
.HtmlAttributes(new  style = "width:115%;font-size:10px;line-height:2em" )
.Columns(columns =>
        
    columns.Bound(m => m.AdvertiserName).Title("Advertiser Name");
);

etc.

【讨论】:

谢谢我会尝试这样做columns.Bound(m =&gt; m.AdvertiserName).Title(m =&gt; m.ColumnName); 然后告诉我有什么结果 @Std_Net,我认为 lambda 表达式行不通,它只需要一个简单的字符串 这是正确的@CSharper - 您只能在此处为列标题定义一个简单的字符串。【参考方案2】:

你实际上不能做你正在尝试的事情。你可以像下面这样绑定你的模型并使用 Title() 就像 #C Sharper 说的那样:

@(Html.Kendo().Grid<Models.Products>()
  .Name("YourReportName")
  .Resizable(resizing => resizing.Columns(true))
  .Columns(columns =>
    
    columns.Bound(p => p.ID).Width(50).Title("ID");
    columns.Bound(p => p.Field1).Width(50).Title("f1");
    columns.Bound(p => p.Field2).Width(50).Title("f2");
    columns.Bound(p => p.Field3).Width(50).Title("f3");
    columns.Bound(p => p.Field4).Width(50).Title("f4");
    columns.Bound(p => p.Field5).Width(50).Title("f5");
    )
  .Scrollable()
  .DataSource(dataSource => dataSource.Ajax()
    .Read(read => read.Action("GetModelData", "Home")))
  .Pageable(pager => pager.Refresh(true))
  .Sortable()
)

如果你用 js 绑定你的网格并接受 JSon 并且你希望你的列名应该是数据库驱动的,这应该是可以实现的。在后面的代码中,您只需使用 JsonConvert.SerializeObject(Products); 将对象转换为 json 并从 DB 中获取所需的列名,将“Field1”、“Field2”等替换为“f1”、“ f2" 等。希望这会有所帮助。如果您需要进一步的帮助,请发表评论。谢谢。

【讨论】:

【参考方案3】:

感谢您的回答。但我找到了其他解决方案 我创建类

public class MyMetadataProvider : AssociatedMetadataProvider

    public MyMetadataProvider () : base()
    
    

    protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType,
                                                    string propertyName)
    
        var metaData = new ModelMetadata(this, containerType, modelAccessor, modelType, propertyName);

        if (propertyName == null)
            return metaData;
        if (propertyName.StartsWith("Field"))
        
            var c = DbHelper.GetProductColumns();//get data from database
            if (c.Count == 1)
            
                if (c != null && propertyName == "Field1")
                    metaData.DisplayName = c[0].F1;
                if (c != null && propertyName == "Field2")
                    metaData.DisplayName = c[0].F2;
                if (c != null && propertyName == "Field3")
                    metaData.DisplayName = c[0].F3;
                if (c != null && propertyName == "Field4")
                    metaData.DisplayName = c[0].F4;
                if (c != null && propertyName == "Field5")
                    metaData.DisplayName = c[0].F5;
            
        
        else
        
            if (attributes != null)
            
                foreach (var a in attributes)
                
                    var type = a.TypeId as Type;
                    if (type != null && type.Name == "DisplayNameAttribute")
                    
                        var dn = (a as DisplayNameAttribute).DisplayName;
                        if (!string.IsNullOrEmpty(dn))
                            metaData.DisplayName = dn;

                    
                
            
        
        return metaData;
    



使用这个元数据提供程序,我可以更改我网站中的任何网格,而无需任何额外的 JS 代码。我希望这对其他人有帮助。 再次感谢。

【讨论】:

在哪里包含这个类? 进入文件 Global.asax.cs 添加到protected void Application_Start()... ModelMetadataProviders.Current = new BarcodeMetadataProvider();【参考方案4】:

如果可用,请使用您的模型。像这样

@Html.Kendo().Grid(Model.Records).Name("ProfessionalScheduleGrid").Columns(x=>
    
        x.Bound(item => item.Staff.User.Email).Title("Email");
        x.Bound(item => item.Discipline.Name).Title("Discipline");
        x.Bound(item => item.Day1Activity.Activity.Code).Title(Model.SelectedSchedule.ScheduleDays.OrderBy(y => y.DayNumber).Where(y => y.DayNumber == 1).First().Day.ToString("ddd(dd)"));
        x.Bound(item => item.Day2Activity.Activity.Code).Title(Model.SelectedSchedule.ScheduleDays.OrderBy(y => y.DayNumber).Where(y => y.DayNumber == 2).First().Day.ToString("ddd(dd)"));
        x.Bound(item => item.Day3Activity.Activity.Code).Title(Model.SelectedSchedule.ScheduleDays.OrderBy(y => y.DayNumber).Where(y => y.DayNumber == 3).First().Day.ToString("ddd(dd)"));
        x.Bound(item => item.Day4Activity.Activity.Code).Title(Model.SelectedSchedule.ScheduleDays.OrderBy(y => y.DayNumber).Where(y => y.DayNumber == 4).First().Day.ToString("ddd(dd)"));
        x.Bound(item => item.Day5Activity.Activity.Code).Title(Model.SelectedSchedule.ScheduleDays.OrderBy(y => y.DayNumber).Where(y => y.DayNumber == 5).First().Day.ToString("ddd(dd)"));
        x.Bound(item => item.EntireWeekActivity).Title("Set Entire Week");
).Sortable().Filterable().Pageable().Selectable().DataSource(dataSource => dataSource.Server().Model(model => model.Id(p => p.Id)))

【讨论】:

【参考方案5】:

嘿,我在通过 Jquery 生成的剑道网格中做了同样的事情。

第 1 步: 从第二个表的数据(代码、供应商、型号、年份、价格)创建一个数组。

第 2 步: 构建一个 ColumnList,使其对象的“字段”属性指向您的表 1,并且“标题”将从我们创建的数组元素中获取。

第 3 步: 将此 columnList 分配给您的 kendo columns 属性。

唯一需要注意的是两个表中的列数应该相等。

【讨论】:

【参考方案6】:

正如这篇文章中的回答...http://www.somedave.com/posts/automatically-generating-column-titles-for-a-kendoui-mvc-grid

使用方法:

columns.Bound(p => p.YourField).DisplayNameTitle();

添加代码:

public static GridBoundColumnBuilder<TModel> DisplayNameTitle<TModel>(
this GridBoundColumnBuilder<TModel> builder) where TModel : class, new()

    // Create an adapter to access the typed grid column
    // (which contains the Expression)
Type adapterType = typeof(GridBoundColumnAdapter<,>)
    .MakeGenericType(typeof(TModel), builder.Column.MemberType);
IGridBoundColumnAdapter adapter =
    (IGridBoundColumnAdapter)Activator.CreateInstance(adapterType);

// Use the adapter to get the title and set it
return builder.Title(adapter.GetDisplayName(builder.Column));


private interface IGridBoundColumnAdapter

    string GetDisplayName(IGridBoundColumn column);


private class GridBoundColumnAdapter<TModel, TValue>
: IGridBoundColumnAdapter where TModel : class, new()

    public string GetDisplayName(IGridBoundColumn column)
    
    // Get the typed bound column
    GridBoundColumn<TModel, TValue> boundColumn =
        column as GridBoundColumn<TModel, TValue>;
    if (boundColumn == null) return String.Empty;

    // Create the appropriate HtmlHelper and use it to get the display name
    HtmlHelper<TModel> helper = HtmlHelpers.For<TModel>(
        boundColumn.Grid.ViewContext,
        boundColumn.Grid.ViewData,
        new RouteCollection());
    return helper.DisplayNameFor(boundColumn.Expression).ToString();
    

【讨论】:

以上是关于ASP NET MVC 剑道网格和列名的主要内容,如果未能解决你的问题,请参考以下文章

在剑道网格 ASP.NET MVC ClientTemplate 中转义 +(加号)符号

ASP .NET MVC 动态列名?

如何在asp.net的GridView中按列名而不是按索引获取单元格值

在Javascript中从Kendo网格中的列名获取列索引

动态生成列名时如何获取kendo选择的行值

在 asp.net 中绑定剑道网格的问题