Linq多表链接分页,Select new{"需要的字段列.."},配合杨涛Mvcpager,前台遍历展示自定义字段
2014-12-17 10:37
447 查看
(1) 我的例子是,(Tb_Mnager)管理员表与(Tb_Role)角色表联查,返回两个表部分字段的组合
如下控制器代码:
[csharp] view
plaincopyprint?
public ActionResult List(int? pager)
{
pager = pager ?? 1;
int pageSize =20;
MyMvcCmsEntities db = new MyMvcCmsEntities();
//多表链接查询,Select new{}返回需要的字段
//注意此处,rs实际会是一个List<Object>对象,如何在视图中遍历???答:反射
var rs = (from m in db.Tb_Manager
join r in db.Tb_Role on m.roleId equals r.id orderby m.sequeNum descending
select new
{
m.id,
//自定义的状态,sql语句会转化为case..when..then
status = m.isDisable == 1 ? "<font color='red'>禁用</font>" : "<font color='green'>正常</font>",
m.loginName,
m.sequeNum,
m.date,
//角色表中的角色名字
r.roleName
});
//查询总数----sql事件探查器可知:此处会查询一次数据库
ViewBag.allCount = rs.Count();
//本语句会自动生成select top....,并把结果List<Object>返回----此处会查询一次数据库
ViewBag.list = rs.ToPagedList((int)pager, pageSize);
return View();
}
(2) 好了,结果返回了,那么前台如何遍历遍历List<Object>的值呢?
答案:反射 详情 C#反射的简单应用
此处,我用反射原理,写了一个帮助类:
[csharp] view
plaincopyprint?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace Mvc.Util
{
public class Reflection
{
/// <summary>
/// 获取指定属性的值(不区分大小写)
/// </summary>
/// <param name="PropertyName">属性名称</param>
/// <param name="o">目标对象</param>
/// <returns></returns>
public static Object GetPropertyValueByName(string PropertyName, Object o)
{
if (o == null)
{
o = new { };
}
//创建一个返回对象
Object returnObject = new Object();
PropertyInfo[] p1 = o.GetType().GetProperties();
foreach (PropertyInfo pi in p1)
{
if (pi.Name.ToLower() == PropertyName.ToLower())
{
returnObject = pi.GetValue(o);
}
}
return returnObject;
}
}
}
(3) 这就好办了,那么我们在视图View中遍历并读取值就简单多了:
[html] view
plaincopyprint?
@{int index = 0;}
@foreach (Object t in ViewBag.list)
{
index++;
<tr>
<td align="center"><span class="checkall" style="vertical-align:middle;"><input class="list-box" value="@Reflection.GetPropertyValueByName("id", t).ToString()" type="checkbox" /></span></td>
<td>@index</td>
<td>@Reflection.GetPropertyValueByName("loginName", t).ToString()</td>
<td>
@Reflection.GetPropertyValueByName("roleName", t).ToString()
</td>
<td>@Reflection.GetPropertyValueByName("date", t).ToString()</td>
<td>
@Html.Raw(Reflection.GetPropertyValueByName("status", t).ToString())
</td>
<td>
<input type="text" value="@Reflection.GetPropertyValueByName("sequeNum", t).ToString()" class="sort" />
</td>
<td align="center"><a href='@Url.Action("edit", "manager", new { area="cms",id=Reflection.GetPropertyValueByName("id", t).ToString()})'>修改</a></td>
</tr>
}
视图中分页代码,注意Html.Pager扩展方法第一个参数的类型为IPagedList:
[html] view
plaincopyprint?
@Html.Pager((IPagedList)ViewBag.list, new PagerOptions { PageIndexParameterName = "pager", ShowPageIndexBox = false, PageIndexBoxType = PageIndexBoxType.TextBox, ShowGoButton = false, FirstPageText = "首页", LastPageText = "尾页", ShowFirstLast = true, CurrentPagerItemWrapperFormatString = "<span class=\"current\">{0}</span>", CssClass = "default" }, new { @style = "width:100%;float=left;" })
如下控制器代码:
[csharp] view
plaincopyprint?
public ActionResult List(int? pager)
{
pager = pager ?? 1;
int pageSize =20;
MyMvcCmsEntities db = new MyMvcCmsEntities();
//多表链接查询,Select new{}返回需要的字段
//注意此处,rs实际会是一个List<Object>对象,如何在视图中遍历???答:反射
var rs = (from m in db.Tb_Manager
join r in db.Tb_Role on m.roleId equals r.id orderby m.sequeNum descending
select new
{
m.id,
//自定义的状态,sql语句会转化为case..when..then
status = m.isDisable == 1 ? "<font color='red'>禁用</font>" : "<font color='green'>正常</font>",
m.loginName,
m.sequeNum,
m.date,
//角色表中的角色名字
r.roleName
});
//查询总数----sql事件探查器可知:此处会查询一次数据库
ViewBag.allCount = rs.Count();
//本语句会自动生成select top....,并把结果List<Object>返回----此处会查询一次数据库
ViewBag.list = rs.ToPagedList((int)pager, pageSize);
return View();
}
(2) 好了,结果返回了,那么前台如何遍历遍历List<Object>的值呢?
答案:反射 详情 C#反射的简单应用
此处,我用反射原理,写了一个帮助类:
[csharp] view
plaincopyprint?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace Mvc.Util
{
public class Reflection
{
/// <summary>
/// 获取指定属性的值(不区分大小写)
/// </summary>
/// <param name="PropertyName">属性名称</param>
/// <param name="o">目标对象</param>
/// <returns></returns>
public static Object GetPropertyValueByName(string PropertyName, Object o)
{
if (o == null)
{
o = new { };
}
//创建一个返回对象
Object returnObject = new Object();
PropertyInfo[] p1 = o.GetType().GetProperties();
foreach (PropertyInfo pi in p1)
{
if (pi.Name.ToLower() == PropertyName.ToLower())
{
returnObject = pi.GetValue(o);
}
}
return returnObject;
}
}
}
(3) 这就好办了,那么我们在视图View中遍历并读取值就简单多了:
[html] view
plaincopyprint?
@{int index = 0;}
@foreach (Object t in ViewBag.list)
{
index++;
<tr>
<td align="center"><span class="checkall" style="vertical-align:middle;"><input class="list-box" value="@Reflection.GetPropertyValueByName("id", t).ToString()" type="checkbox" /></span></td>
<td>@index</td>
<td>@Reflection.GetPropertyValueByName("loginName", t).ToString()</td>
<td>
@Reflection.GetPropertyValueByName("roleName", t).ToString()
</td>
<td>@Reflection.GetPropertyValueByName("date", t).ToString()</td>
<td>
@Html.Raw(Reflection.GetPropertyValueByName("status", t).ToString())
</td>
<td>
<input type="text" value="@Reflection.GetPropertyValueByName("sequeNum", t).ToString()" class="sort" />
</td>
<td align="center"><a href='@Url.Action("edit", "manager", new { area="cms",id=Reflection.GetPropertyValueByName("id", t).ToString()})'>修改</a></td>
</tr>
}
视图中分页代码,注意Html.Pager扩展方法第一个参数的类型为IPagedList:
[html] view
plaincopyprint?
@Html.Pager((IPagedList)ViewBag.list, new PagerOptions { PageIndexParameterName = "pager", ShowPageIndexBox = false, PageIndexBoxType = PageIndexBoxType.TextBox, ShowGoButton = false, FirstPageText = "首页", LastPageText = "尾页", ShowFirstLast = true, CurrentPagerItemWrapperFormatString = "<span class=\"current\">{0}</span>", CssClass = "default" }, new { @style = "width:100%;float=left;" })
相关文章推荐
- Linq多表链接分页,Select new{"需要的字段列.."},配合杨涛Mvcpager,前台遍历展示自定义字段
- Linq多表链接分页,Select new{"需要的字段列.."},配合杨涛Mvcpager,前台遍历展示自定义字段
- "组合关键词"搜索你需要的链接小结
- LINQ自定义真分页(尚未添加多字段动态查询与多字段排序)
- 如何使 FlashGet "正常合法" 下载 Session 中的自定义文件链接呢? JSP/Servlet 实现!
- 在向"带有自增字段的数据库表"中插入数据时,自定义"该自增字段"的数据
- DEDE给自定义模型的字段加上链接
- mssql如何把1个字段里的"as|dkf|j|haj|skfdkl"分拆为5个字段输出?
- 数据库字段为何会显示为[user]而不是user,外面多个 "[]"?
- 修改fckeditor增加自定义按钮,配合大文章分页
- "word中无法注册这篇文档 不能创建其他文档到这篇文档的链接"的解决
- "IE浏览器遇到问题需要关闭"的解决办法
- Asp.Net自定义分页控件(前台/后台)有图
- "无限流"分页程序
- 去掉ie7启动时的"自定义您的设置"
- 金色海洋同学的"关于Int自增字段和GUID字段的性能测试"
- 自己遇到的"Microsoft Management Console遇到问题需要关闭,我们对此引起的不便表示抱歉……"问题的解决方法
- Repeater控件的嵌套使用、自定义分页及加链接,样式制定源代码。
- 在DLL编程中调用模版类时出现的类似"class“XXX”需要有 dll 接口由 class“XXX”的客户端使用"的warning的解决方案
- "msiexec.exe has encountered a problem and needs to close" "msiexec.exe 遇到问题需要关闭"