如何在FineUIMvc(ASP.NET MVC)中显示复杂的表格列数据(列表和对象)?
起源

最初,这个问题是知识星球内的一个网友提出的,如何在FineUIMvc中展现复杂的列数据?
在FineUIPro中,我们都知道有一个 TemplateField 模板列可以使用,我们只需要在后台定义一个 C# 方法,就可以返回任意想要的数据。
可是在FineUIMvc中没有这么个列类型,那又如何展示复杂数据呢?
解决办法
先来看下数据模型:
public class Student
{
[Key]
public int Id { get; set; } [Required]
[Display(Name = "姓名")]
[StringLength()]
public string Name { get; set; } [Required]
[Display(Name = "性别")]
public int Gender { get; set; } [Required]
[Display(Name = "入学年份")]
public int EntranceYear { get; set; } [Required]
[Display(Name = "是否在校")]
public bool AtSchool { get; set; } [Required]
[Display(Name = "所学专业")]
[StringLength()]
public string Major { get; set; } [Required]
[Display(Name = "分组")]
public int Group { get; set; } [Display(Name = "注册日期")]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}")]
public DateTime? EntranceDate { get; set; } [Display(Name = "爱好")]
public string[] Hobby { get; set; } [Display(Name = "家庭信息")]
public Family Family { get; set; } }
通过一个静态方法获取模拟数据:
public class StudentHelper
{
public static IEnumerable<Student> GetSimpleStudentList()
{
var students = new List<Student> {
new Student {
Id= ,
Name= "张萍萍",
Gender= ,
EntranceYear= ,
AtSchool= true,
Major= "材料科学与工程系",
Group = ,
EntranceDate= DateTime.Parse("2000-09-01"),
Hobby = new string[]{"reading","basketball","travel"},
Family = new Family {
FatherName = "张国栋",
MotherName = "李梅"
}
},
new Student {
Id= ,
Name= "陈飞",
Gender= ,
EntranceYear= ,
AtSchool= false,
Major= "化学系",
Group = ,
EntranceDate= DateTime.Parse("2001-09-01"),
Hobby = new string[]{"reading","basketball"},
Family = new Family {
FatherName = "陈国梁",
MotherName = "周兰"
}
},
new Student {
Id= ,
Name= "董婷婷",
Gender= ,
EntranceYear= ,
AtSchool= true,
Major= "化学系",
Group = ,
EntranceDate= DateTime.Parse("2008-09-01"),
Hobby = new string[]{"reading","basketball","music"},
Family = new Family {
FatherName = "董辅仁",
MotherName = "刘静"
}
},
new Student {
Id= ,
Name= "刘国",
Gender= ,
EntranceYear= ,
AtSchool= false,
Major= "化学系",
Group = ,
EntranceDate= DateTime.Parse("2002-09-01"),
Hobby = new string[]{"reading","music"},
Family = new Family {
FatherName = "刘房龄",
MotherName = "湘采荷"
}
},
new Student {
Id= ,
Name= "康颖颖",
Gender= ,
EntranceYear= ,
AtSchool= true,
Major= "数学系",
Group = ,
EntranceDate= DateTime.Parse("2008-09-01"),
Hobby = new string[]{"travel","movie","music"},
Family = new Family {
FatherName = "康有为",
MotherName = "陆小妹"
}
}
}; return students;
} }
视图定义也很简单:
@(F.Grid().IsFluid(true).CssClass("blockpanel").Title("表格").ShowHeader(true).ShowBorder(true).ID("Grid1").DataIDField("Id").DataTextField("Name")
.Columns(
F.RowNumberField(),
F.RenderFieldFor(m => m.Name),
F.RenderFieldFor(m => m.Gender).RendererFunction("renderGender").Width(80),
F.RenderFieldFor(m => m.EntranceYear),
F.RenderCheckFieldFor(m => m.AtSchool).RenderAsStaticField(true),
F.RenderFieldFor(m => m.Major).RendererFunction("renderMajor").ExpandUnusedSpace(true),
F.RenderFieldFor(m => m.Group).RendererFunction("renderGroup").Width(80),
F.RenderFieldFor(m => m.EntranceDate)
).DataSource(Model)
)

现在,我们希望能在表格中显示这个用户的爱好和家庭信息,最终的页面效果如图所示:

这里我们需要用到继承,从最初的模型类 Student 继承,因为这个继承类只在视图层用到,我们命名为 StudentViewModel:
public class StudentViewModel : Student
{ [Display(Name = "爱好")]
public string HobbyInfo
{
get
{
List<string> hobbyNames = new List<string>();
foreach (var hobby in Hobby)
{
var hobbyName = "";
switch (hobby)
{
case "reading":
hobbyName = "读书";
break;
case "basketball":
hobbyName = "篮球";
break;
case "travel":
hobbyName = "旅游";
break;
case "movie":
hobbyName = "电影";
break;
case "music":
hobbyName = "音乐";
break;
}
hobbyNames.Add(hobbyName);
}
return String.Join(",", hobbyNames.ToArray());
}
} [Display(Name = "家庭信息")]
public string FamilyInfo
{
get
{
return "父亲:" + Family.FatherName + ",母亲:" + Family.MotherName;
}
} }
可以看到,在这个继承的模型类中扩展了两个属性 HobbyInfo 和 FamilyInfo,其中定义了相应的业务逻辑。
获取数据时,需要转为相应的视图模型类:
public ActionResult Index()
{
var students = new List<StudentViewModel>();
foreach (var student in StudentHelper.GetSimpleStudentList())
{
students.Add(new StudentViewModel
{
Id = student.Id,
Name = student.Name,
Gender = student.Gender,
EntranceYear = student.EntranceYear,
AtSchool = student.AtSchool,
Major = student.Major,
Group = student.Group,
EntranceDate = student.EntranceDate,
Hobby = student.Hobby,
Family = student.Family
});
} return View(students);
}
最后是,Razor视图定义:
@(F.Grid().ID("Grid1").IsFluid(true).CssClass("blockpanel").ShowBorder(true).ShowHeader(true).Title("表格").DataIDField("Id").DataTextField("Name")
.Columns(
F.RenderFieldFor(m => m.Name),
F.RenderFieldFor(m => m.Gender).RendererFunction("renderGender").Width(80),
F.RenderFieldFor(m => m.EntranceYear),
F.RenderCheckFieldFor(m => m.AtSchool).RenderAsStaticField(true),
F.RenderFieldFor(m => m.Major).RendererFunction("renderMajor").Width(150),
F.RenderFieldFor(m => m.FamilyInfo).Width(220),
F.RenderFieldFor(m => m.HobbyInfo).ExpandUnusedSpace(true)
).DataSource(Model)
)
搞定!
如何在FineUIMvc(ASP.NET MVC)中显示复杂的表格列数据(列表和对象)?的更多相关文章
- Asp.net MVC中 Controller 与 View之间的数据传递
在ASP.NET MVC中,经常会在Controller与View之间传递数据 1.Controller向View中传递数据 (1)使用ViewData["user"] (2)使用 ...
- 如何在 ASP.NET MVC 中集成 AngularJS(3)
今天来为大家介绍如何在 ASP.NET MVC 中集成 AngularJS 的最后一部分内容. 调试路由表 - HTML 缓存清除 就在我以为示例应用程序完成之后,我意识到,我必须提供两个版本的路由表 ...
- 如何在 ASP.NET MVC 中集成 AngularJS(2)
在如何在 ASP.NET MVC 中集成 AngularJS(1)中,我们介绍了 ASP.NET MVC 捆绑和压缩.应用程序版本自动刷新和工程构建等内容. 下面介绍如何在 ASP.NET MVC 中 ...
- 如何在 ASP.NET MVC 中集成 AngularJS(1)
介绍 当涉及到计算机软件的开发时,我想运用所有的最新技术.例如,前端使用最新的 JavaScript 技术,服务器端使用最新的基于 REST 的 Web API 服务.另外,还有最新的数据库技术.最新 ...
- ASP.NET MVC 中使用 AjaxFileUpload 插件时,上传图片后不能显示(预览)
AjaxFileUpload 插件是一个很简洁很好用的上传文件的插件,可以实现异步上传功能,但是在 ASP.NET MVC中使用时,会出现上传图片后不能正确的显示的问题,经过仔细排查,终于找到原因,解 ...
- 如何在asp.net mvc中添加自定义的HTML辅助种方法
很久没在博客园发表文章了,今天来总结一下如何在asp.net mvc中添加自定义的HTML辅助方法.我们现在设计这么一个目前,利用自定义的HTML方法来渲染一个普通的img标记.直接进入主题吧: 首先 ...
- 在ASP.Net MVC 中,如何在Global.asax中配置一个指向Area内部的默认Route
ASP.Net MVC 中配置Route的时候可以设置一个默认的Route. 比如我要在输入http://localhost的时候默认进入http://localhost/home/index.可以在 ...
- 在 ASP.NET MVC 中充分利用 WebGrid (microsoft 官方示例)
在 ASP.NET MVC 中充分利用 WebGrid https://msdn.microsoft.com/zh-cn/magazine/hh288075.aspx Stuart Leeks 下载代 ...
- 《Entity Framework 6 Recipes》中文翻译系列 (20) -----第四章 ASP.NET MVC中使用实体框架之在MVC中构建一个CRUD示例
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第四章 ASP.NET MVC中使用实体框架 ASP.NET是一个免费的Web框架 ...
随机推荐
- 如何以编程方式签署应用程序包(C ++)
了解如何使用SignerSignEx2函数对应用包进行签名. 如果要使用Packaging API以编程方式创建Windows应用商店应用包,则还需要在部署之前对应用包进行签名.Packaging A ...
- Entity Framework Core 2.1,添加种子数据
EFCore 2.1出来有一段时间了,里面的新功能还没怎么用,今天研究下如何使用EF Core 2.1添加种子数据. 这部分的官方文档地址是:https://docs.microsoft.com/en ...
- 一次composer错误使用引发的思考
一次composer错误使用引发的思考 这个思考源自于一个事故.让我对版本依赖重新思考了一下. 事故现象 一个线上的管理后台,一个使用laravel搭建的管理后台,之前在线上跑的好好的,今天comop ...
- ZooKeeper 02 - ZooKeeper集群的节点为什么是奇数个
目录 1 关于节点个数的说明 2 ZooKeeper集群的容错数 3 ZooKeeper集群可用的标准 4 为什么不能是偶数个节点 4.1 防止由脑裂造成的集群不可用 4.2 奇数个节点更省资源 4. ...
- Redis~Linux环境下的部署
回到目录 Redis的生产环境建议部署到linux上,而在开发时可以连接windows版本,下面介绍如何在linux上部署redis. $ wget http://download.redis.io/ ...
- 学习ASP.NET Core Razor 编程系列十二——在页面中增加校验
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 基于 DataLakeAnalytics 做跨地域的数据分析
在阿里云上,很多客户的应用都是多地域部署的, 比如在北京(cn-beijing)的地域部署一个应用让北方的客户访问快一点,同时在杭州(cn-hangzhou)地域部署一份让南方的客户访问快一点.多地域 ...
- Shell编程(week4_day4)--技术流ken
本节内容 1. shell函数 2. shell正则表达式 shell函数 shell中允许将一组命令集合或语句形成一段可用代码,这些代码块称为shell函数.给这段代码起个名字称为函数名,后续可以直 ...
- Easyui 合并单元格
onMyLoadSuccessText: function () { $(".datagrid-row").mouseover(function () { var titlestr ...
- Git 安装配置手册
Git 安装配置手册 首先我们要了解 Git 是类似于 SVN 用来管理项目的 首先要先下载 Git ,这个东西相当于一个核,是该功能的核心 下载地址(<https://gitforwindow ...