回到目录

对于数据分页,我们已经见的太多了,几乎每个列表页面都要用到分页,这已经成了一种定理了,在进行大数据展示时,如果不去分页,而直接把数据加载到内存,这简直是不可以去相向的,呵呵,在很多ORM工具中都对分页有了更好的支持,如LINQ里有大家熟悉的take和skip,而在MongoDB里也有这种概念,它使用limit和skip实现,这在大多数的Mongo客户端上都集成了这个功能,即帮助我们组合命令参数,并带我们把分页取数据的指令发到Mongo服务器去,实现分页技术!

添加了分页后的IMongoRepository接口

        /// <summary>
/// MongoDB集成的查询方法,大数据情况下,有分页时使用这个方法
/// </summary>
/// <typeparam name="U">匿名对象,用来为条件赋值</typeparam>
/// <param name="template">条件对象</param>
/// <param name="limit"></param>
/// <param name="skip"></param>
/// <returns></returns>
PagedResult<TEntity> GetModel<U>(U template, int pageIndex, int pageSize);
/// <summary>
/// MongoDB集成的查询方法,大数据情况下,有分页和排序时使用这个方法
/// </summary>
/// <typeparam name="U">匿名对象,用来为条件赋值</typeparam>
/// <typeparam name="O">匿名对象,用来为排序赋值,NoRM.OrderBy枚举</typeparam>
/// <param name="template">条件对象</param>
/// <param name="orderby">排序对象</param>
/// <param name="limit"></param>
/// <param name="skip"></param>
/// <returns></returns>
PagedResult<TEntity> GetModel<U, O>(U template, O orderby, int pageIndex, int pageSize);

看我是如何去实现它的,事实上是调用了Mongo客户端封装的Find<T, U, O>(this IMongoCollection<T> collection, U template, O orderby, int limit, int skip);方法

实现的,我们来看一下代码

  public PagedResult<TEntity> GetModel<U, O>(U template, O orderby, int pageIndex, int pageSize)
{
var skip = (pageIndex - ) * pageSize;
var limit = pageSize;
var recordCount = _table.Count();
return new PagedResult<TEntity>(
recordCount,
(int)(recordCount + pageSize - ) / pageSize,
pageSize,
pageIndex,
_table.Find(template, orderby, limit, skip).ToList());
}

代码主要实现的是分页和排序功能,其中template是查询条件,可以传入一个匿名对象,而orderby参数表示一个排序的匿名对象,把排序字段写到对象里即可,升序为1,降

序为-1,也可以使用它定义好的枚举来赋值,下面我们为上面方法做一个重载,来针对不需要排序的需求

   public PagedResult<TEntity> GetModel<U>(U template, int pageIndex, int pageSize)
{
return GetModel(template, new { }, pageIndex, pageSize);
}

有了底层的方法,再来看它的返回值,如果是分页返回对象,那么一定要返回一个PagedResult泛型对象,这个对象主要向外部公开一个参数,如当前页的数据集,当前页号

每面显示记录数,总页数和总的记录数及URL条件集合等。

    /// <summary>
/// 分页结果对象,UI显示它,BLL为它赋值
/// 陈晴阳开发,张占岭修改,添加了AddParameters属性,用来存储URL参数
/// </summary>
/// <typeparam name="T"></typeparam>
public class PagedResult<T> : IEnumerable<T>, ICollection<T>
{
#region Public Fields
/// <summary>
/// 获取一个当前类型的空值。
/// </summary>
public static readonly PagedResult<T> Empty = new PagedResult<T>(, , , , null);
#endregion #region Ctor
/// <summary>
/// 初始化一个新的<c>PagedResult{T}</c>类型的实例。
/// </summary>
public PagedResult()
{
Data = new List<T>();
AddParameters = new NameValueCollection();
PageSize = ;
}
/// <summary>
/// 初始化一个新的<c>PagedResult{T}</c>类型的实例。
/// </summary>
/// <param name="totalRecords">总记录数。</param>
/// <param name="totalPages">页数。</param>
/// <param name="pageSize">页面大小。</param>
/// <param name="pageNumber">页码。</param>
/// <param name="data">当前页面的数据。</param>
public PagedResult(long totalRecords, int totalPages, int pageSize, int pageNumber, List<T> data)
{
this.TotalPages = totalPages;
this.TotalRecords = totalRecords;
this.PageSize = pageSize;
this.PageIndex = pageNumber;
this.Data = data;
}
#endregion #region Public Properties
/// <summary>
/// 获取或设置总记录数。
/// </summary>
public long TotalRecords { get; set; }
/// <summary>
/// 获取或设置页数。
/// </summary>
public int TotalPages { get; set; }
/// <summary>
/// 获取或设置页面大小。
/// </summary>
public int PageSize { get; set; }
/// <summary>
/// 获取或设置页码。
/// </summary>
public int PageIndex { get; set; }
/// <summary>
/// 获取或设置当前页面的数据。
/// </summary>
public List<T> Data { get; set; }
/// <summary>
/// 分页参数
/// </summary>
public NameValueCollection AddParameters { get; set; }
#endregion #region Public Methods
/// <summary>
/// 确定指定的Object是否等于当前的Object。
/// </summary>
/// <param name="obj">要与当前对象进行比较的对象。</param>
/// <returns>如果指定的Object与当前Object相等,则返回true,否则返回false。</returns>
/// <remarks>有关此函数的更多信息,请参见:http://msdn.microsoft.com/zh-cn/library/system.object.equals。
/// </remarks>
public override bool Equals(object obj)
{
if (ReferenceEquals(this, obj))
return true;
if (obj == (object)null)
return false;
var other = obj as PagedResult<T>;
if (other == (object)null)
return false;
return this.TotalPages == other.TotalPages &&
this.TotalRecords == other.TotalRecords &&
this.PageIndex == other.PageIndex &&
this.PageSize == other.PageSize &&
this.Data == other.Data;
} /// <summary>
/// 用作特定类型的哈希函数。
/// </summary>
/// <returns>当前Object的哈希代码。</returns>
/// <remarks>有关此函数的更多信息,请参见:http://msdn.microsoft.com/zh-cn/library/system.object.gethashcode。
/// </remarks>
public override int GetHashCode()
{
return this.TotalPages.GetHashCode() ^
this.TotalRecords.GetHashCode() ^
this.PageIndex.GetHashCode() ^
this.PageSize.GetHashCode();
} /// <summary>
/// 确定两个对象是否相等。
/// </summary>
/// <param name="a">待确定的第一个对象。</param>
/// <param name="b">待确定的另一个对象。</param>
/// <returns>如果两者相等,则返回true,否则返回false。</returns>
public static bool operator ==(PagedResult<T> a, PagedResult<T> b)
{
if (ReferenceEquals(a, b))
return true;
if ((object)a == null || (object)b == null)
return false;
return a.Equals(b);
} /// <summary>
/// 确定两个对象是否不相等。
/// </summary>
/// <param name="a">待确定的第一个对象。</param>
/// <param name="b">待确定的另一个对象。</param>
/// <returns>如果两者不相等,则返回true,否则返回false。</returns>
public static bool operator !=(PagedResult<T> a, PagedResult<T> b)
{
return !(a == b);
}
#endregion #region IEnumerable<T> Members
/// <summary>
/// 返回一个循环访问集合的枚举数。
/// </summary>
/// <returns>一个可用于循环访问集合的 IEnumerator 对象。</returns>
public IEnumerator<T> GetEnumerator()
{
return Data.GetEnumerator();
} #endregion #region IEnumerable Members
/// <summary>
/// 返回一个循环访问集合的枚举数。 (继承自 IEnumerable。)
/// </summary>
/// <returns>一个可用于循环访问集合的 IEnumerator 对象。</returns>
IEnumerator IEnumerable.GetEnumerator()
{
return Data.GetEnumerator();
} #endregion #region ICollection<T> Members
/// <summary>
/// 将某项添加到 ICollection{T} 中。
/// </summary>
/// <param name="item">要添加到 ICollection{T} 的对象。</param>
public void Add(T item)
{
Data.Add(item);
} /// <summary>
/// 从 ICollection{T} 中移除所有项。
/// </summary>
public void Clear()
{
Data.Clear();
} /// <summary>
/// 确定 ICollection{T} 是否包含特定值。
/// </summary>
/// <param name="item">要在 ICollection{T} 中定位的对象。</param>
/// <returns>如果在 ICollection{T} 中找到 item,则为 true;否则为 false。</returns>
public bool Contains(T item)
{
return Data.Contains(item);
} /// <summary>
/// 从特定的 Array 索引开始,将 ICollection{T} 的元素复制到一个 Array 中。
/// </summary>
/// <param name="array">作为从 ICollection{T} 复制的元素的目标的一维 Array。 Array 必须具有从零开始的索引。</param>
/// <param name="arrayIndex">array 中从零开始的索引,从此索引处开始进行复制。</param>
public void CopyTo(T[] array, int arrayIndex)
{
Data.CopyTo(array, arrayIndex);
} /// <summary>
/// 获取 ICollection{T} 中包含的元素数。
/// </summary>
public int Count
{
get { return Data.Count; }
} /// <summary>
/// 获取一个值,该值指示 ICollection{T} 是否为只读。
/// </summary>
public bool IsReadOnly
{
get { return false; }
} /// <summary>
/// 从 ICollection{T} 中移除特定对象的第一个匹配项。
/// </summary>
/// <param name="item">要从 ICollection{T} 中移除的对象。</param>
/// <returns>如果已从 ICollection{T} 中成功移除 item,则为 true;否则为 false。 如果在原始 ICollection{T} 中没有找到 item,该方法也会返回 false。 </returns>
public bool Remove(T item)
{
return Data.Remove(item);
} #endregion
}

有了底层方法和返回的对象,下面就是前台显示了,我们可以扩展一个PagerHelper,重新为它起个名字叫PagedResultHelper吧,把它的相关PagedList类型对象修改成PagedResult对象即可,代码如下

  /// <summary>
/// 关于PagedResult对象的分页展示
/// 作者:张占岭,花名:仓储大叔
/// </summary>
public static class PagedResultHelper
{ #region Ajax分页
/// <summary>
/// AJAX分页
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="html"></param>
/// <param name="pagedList"></param>
/// <param name="UpdateTargetId"></param>
/// <returns></returns>
public static MvcHtmlString AjaxPagerResult<T>(this HtmlHelper html, PagedResult<T> pagedList, string UpdateTargetId, bool isDisplayCompletePage)
{
var ui = new UIHelper(html.ViewContext.RequestContext.HttpContext.Request.Url.ToString(), UpdateTargetId, pagedList.AddParameters);
if (!isDisplayCompletePage)
return MvcHtmlString.Create(ui.GetPage(pagedList.PageIndex, pagedList.PageSize, (int)pagedList.TotalRecords, false));
else
return MvcHtmlString.Create(ui.GetPage(pagedList.PageIndex, pagedList.PageSize, (int)pagedList.TotalRecords));
} public static MvcHtmlString AjaxPager<T>(this HtmlHelper html, PagedResult<T> pagedList, string UpdateTargetId)
{
return AjaxPagerResult<T>(html, pagedList, UpdateTargetId, true);
}
/// <summary>
/// AJAX分页
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="html"></param>
/// <param name="pagedList"></param>
/// <param name="UpdateTargetId"></param>
/// <param name="ActionName"></param>
/// <param name="ControllerName"></param>
/// <returns></returns>
public static MvcHtmlString AjaxPagerResult<T>(this HtmlHelper html, PagedResult<T> pagedList, string UpdateTargetId, string ActionName, string ControllerName, bool isDisplayCompletePage, bool isTop)
{
var mvcUrl = new UrlHelper(html.ViewContext.RequestContext).Action(ActionName, ControllerName); //占岭修改
var localUrl = string.Format(@"{0}://{1}", html.ViewContext.RequestContext.HttpContext.Request.Url.Scheme, html.ViewContext.RequestContext.HttpContext.Request.Url.Authority);
var url = string.Format("{0}{1}{2}", localUrl, mvcUrl, html.ViewContext.RequestContext.HttpContext.Request.Url.Query);
var ui = new UIHelper(url, UpdateTargetId, pagedList.AddParameters);
return MvcHtmlString.Create(ui.GetPage(pagedList.PageIndex, pagedList.PageSize, (int)pagedList.TotalRecords, isDisplayCompletePage, false, isTop));
}
public static MvcHtmlString AjaxPagerResult<T>(this HtmlHelper html, PagedResult<T> pagedList, string UpdateTargetId, string ActionName, string ControllerName, bool isDisplayCompletePage)
{
return AjaxPagerResult<T>(html, pagedList, UpdateTargetId, ActionName, ControllerName, true, false);
}
/// <summary>
/// ajax方式,MVC路由支持的分页
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="html"></param>
/// <param name="pagedList"></param>
/// <param name="UpdateTargetId"></param>
/// <param name="ActionName"></param>
/// <param name="ControllerName"></param>
/// <returns></returns>
public static MvcHtmlString AjaxPagerResult<T>(this HtmlHelper html, PagedResult<T> pagedList, string UpdateTargetId, string ActionName, string ControllerName)
{
var mvcUrl = new UrlHelper(html.ViewContext.RequestContext).Action(ActionName, ControllerName); //占岭修改
var localUrl = string.Format(@"{0}://{1}", html.ViewContext.RequestContext.HttpContext.Request.Url.Scheme, html.ViewContext.RequestContext.HttpContext.Request.Url.Authority);
var url = string.Format("{0}{1}{2}", localUrl, mvcUrl, html.ViewContext.RequestContext.HttpContext.Request.Url.Query);
var ui = new UIHelper(url, UpdateTargetId, pagedList.AddParameters); return MvcHtmlString.Create(ui.GetPage(pagedList.PageIndex
, pagedList.PageSize
, (int)pagedList.TotalRecords
,
, new UrlHelper(html.ViewContext.RequestContext)
, html.ViewContext.RouteData.Values["action"].ToString()
, html.ViewContext.RouteData.Values["controller"].ToString(), true, false, null)); } #endregion #region Html分页
/// <summary>
/// Html分页,不使用MVC路由
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="html"></param>
/// <param name="pagedList"></param>
/// <returns></returns>
public static MvcHtmlString PagerResult<T>(this HtmlHelper html, PagedResult<T> pagedList)
{
return PagerResult<T>(html, pagedList, false);
}
public static MvcHtmlString PagerResult<T>(this HtmlHelper html, PagedResult<T> pagedList, string className)
{
return PagerResult<T>(html, pagedList, false, className);
}
public static MvcHtmlString PagerResult<T>(this HtmlHelper html, PagedResult<T> pagedList, bool router, string className)
{
return PagerResult<T>(html, pagedList, router, true, className);
}
/// <summary>
/// Html分页,router为true表示走MVC路由
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="html"></param>
/// <param name="pagedList"></param>
/// <param name="router">路由</param>
/// <param name="className">CSS类名</param>
/// <returns></returns>
public static MvcHtmlString PagerResult<T>(this HtmlHelper html, PagedResult<T> pagedList, bool router, bool isCompleteDisplay, string className)
{
if (pagedList == null)
return null;
UIHelper ui = new UIHelper(html.ViewContext.RequestContext.HttpContext.Request.Url.ToString(), pagedList.AddParameters);
if (router)
return MvcHtmlString.Create(ui.GetPage(pagedList.PageIndex
, pagedList.PageSize
, (int)pagedList.TotalRecords
,
, new UrlHelper(html.ViewContext.RequestContext)
, html.ViewContext.RouteData.Values["action"].ToString()
, html.ViewContext.RouteData.Values["controller"].ToString(), isCompleteDisplay, false, className));
return MvcHtmlString.Create(ui.GetPage(pagedList.PageIndex, pagedList.PageSize, (int)pagedList.TotalRecords, isCompleteDisplay, className));
}
public static MvcHtmlString PagerResult<T>(this HtmlHelper html, PagedResult<T> pagedList, bool router)
{
return PagerResult<T>(html, pagedList, router, null);
}
#endregion }

这样,我们前台调用分页时,还是一句话就搞定了,呵呵!

aaarticlea/png;base64,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" alt="" />

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAbQAAAAvCAIAAAAEgKglAAAEzUlEQVR4nO2dPW7iQBiGI3EbJC6TJpfgApQucoY0i5Qe0aGUSChaJQ1IFJEQ6VYCulBwgNmCP8N8tsfz4/Eoj/UUxMQz43m/eTTgaPdh/7MHAIA7HqKPAACghSBHAAAB5AgAIIAcAQAEAsrxp8EjVr8mh5exeW+k05/Y0Z7bCXS0oYat00md6EJsTo7N3INe0NGn1e/YQjTiS47kFaLf6JJCjnvkmMTYkGNaeUVMJ3WiF0Ae5JjA2JBjWnlFTCd1ohdAnghy1Kcgf8Zi+moVtEsAocdmOJPIMW5elW2699u8lZRSSin9tcdm61ZXdOLsHDu3Niyv77odhZNj2LGtlt3+56t1I6tl91xhj+/VjYil2Xs7qNNxyJ4d5bgZZEYj0RsJtIR85VXSjviWRb+GKinIaz5S26fLrw23Sqmvt5kfOQ63SimVb7/4vCo4kKOHojecrChy9Dy2989Of9Kxl+P3Y386WO33P0dLnl8XXyXM//P6Sym1mHf6s2wnLYA6cvwYTw01nVxeDdSwkRyL8hpu1WJ+/rXjW37k+LS4+O2mNsTzSqk/f//V3ZB6ydoXMb9zLJqLunPX5GILMbbXl0mnPx28O+wc3z87L9/5BnUr1Vl+s2yn1G7ds5bjatnNPh9td44tz8tkSI79GsmxIK/e2+Giwt7bQe0OX6VyLNrf3bpsPro5fZFg0Xm5/cp7ccnaO03L0WReSqRp0lHlYnPJI+DYHD9WX8ntIouvKg5iPlKFZjST42aQTQcr+4/V+sRaL5sQeenXeq/hOma8z+tpoUbDSad/3FoesuG6XI55hemv872MhpcP8jdylM7faFH8ETnaFGtoObrcVOvluBlkk+54U9lI+VJ5Wth/rP4YT7vjjct3juLE2gUXTo7lS7pBOd7lNct2x+8fZ9lOqcX8+Onb13eOogT186IWTRRpEXE42r5zNJGmFzlW1l/wsXmQ4/djXzajflXF/Q63Sp03ILXkuFp2s+XHz967HPXXsfK6u1acGcd+68rxmtfz+mu37p1sdcieJ1HkWNK4SWotoe07x8bkaEh75bhadgsegIhXBZLj8TlMHl3WLnnVjS+cHMuXdDQ5np7GnJ7D3BzXpzT32io/7ORo3iZyrE7dV2H9RjlWmVG/qmiBHbcYLh+rz/jfOVrEF06O4kz66tdciHd55Z/GnDDbORrCztEP1jvHu5OVsxbxT0N8js1Bjvp+ze5pde7v5uQqjy7HNuRVa0nb9VtTVde8rk9jasox768Sl9WS46Ud/QVytNw5isVUMncNL7ZwYzOcSS+NGC4/Bzn6uZ0W5qW3VvTaul/rdOzQnWW+1zNp09C8yLFi51g+R+JblQVda8GXEGJsFjOJHCPmJV51Nz/u/cY1o7sfdRvmmypp2TrrEPAPTyQwtt8sxxTziphO6kQvgDzIMYGxIce08oqYTupEL4A8yDGBsSHHtPKKmE7qRC+APPw3CcEPL2Pz3ogvOUa8nUBHG2o4uqSQY1g5AgCkC3IEABBAjgAAAsgRAEAAOQIACCBHAAAB5AgAIIAcAQAEkCMAgAByBAAQQI4AAALIEQBAADkCAAggRwAAAeQIACCAHAEABJAjAIAAcgQAEECOAAACyBEAQAA5AgAIIEcAAIH/eW3G6c7vuloAAAAASUVORK5CYII=" alt="" />

事实上,对于PagedResult我们也可以用在其它ORM工具上,因为一定的数据库和NoSql都开放了limit及skip等功能,大家可以放眼去看,放心去想,呵呵!

回到目录

MongoDB学习笔记~为IMongoRepository接口添加分页取集合的方法的更多相关文章

  1. MongoDB学习笔记~为IMongoRepository接口添加了排序和表达式树,针对官方驱动

    回到目录 MongoDB的官方驱动,语法更好,更强 之前写过关于IMongoRepository仓储的文章,在mongodb的驱动选择上使用了NoRM,但是进行$ref引用类型导航时出现了问题,它对引 ...

  2. MongoDB学习笔记~为IMongoRepository接口添加了增删改方法,针对官方驱动

    回到目录 上一讲说了MongoDB官方驱动的查询功能,这回说一下官方驱动的增删改功能,驱动在升级为2.0后,相应的insert,update和delete都只有了异步版本(或者叫并行版本),这当然也是 ...

  3. MongoDB学习笔记~为IMongoRepository接口更新指定字段

    回到目录 对于MongoDB来说,它的更新建议是对指定字段来说的,即不是把对象里的所有字段都进行update,而是按需去更新,这在性能上是最优的,这当然也是非常容易理解的,我们今天要实现的就是这种按需 ...

  4. MongoDB 学习笔记(三):分页、排序与游标

    一.分页 1.limit返回指定条数的数据 2.skip指定跨度 3.limit与skip结合,进行分页 二.排序 1.sort排序:指定排序的key,大于0为升序,小于0为降序.如果指定了多个排序键 ...

  5. MongoDB学习笔记~大叔分享批量添加—批量更新—批量删除

    回到目录 说它是批量操作,就是说将集合对象一次提交到服务器,并对数据进行持久化,如果您的代码是一次一次的提交,那不算是批量操作!在之前的mongodb仓储中并没有对批量更新和批量删除进行实现,而今天在 ...

  6. MongoDB学习笔记~自己封装的Curd操作(查询集合对象属性,更新集合对象)

    回到目录 我不得不说,mongodb官方驱动在与.net结合上做的不是很好,不是很理想,所以,我决定对它进行了二次封装,这是显得很必然了,每个人都希望使用简单的对象,而对使用复杂,麻烦,容易出错的对象 ...

  7. Mongodb学习笔记(二)Capped Collection固定集合

    一.Capped Collection固定集合 简单介绍 capped collections是性能出色的有着固定大小的集合(定容集合),以LRU(Least Recently Used最近最少使用) ...

  8. MongoDB学习笔记系列

    回到占占推荐博客索引 该来的总会来的,Ef,Redis,MVC甚至Sqlserver都有了自己的系列,MongoDB没有理由不去整理一下,这个系列都是平时在项目开发时总结出来的,希望可以为各位一些帮助 ...

  9. MongoDB学习笔记系列~目录

    MongoDB学习笔记~环境搭建 (2015-03-30 10:34) MongoDB学习笔记~MongoDBRepository仓储的实现 (2015-04-08 12:00) MongoDB学习笔 ...

随机推荐

  1. SSH/SSL 源码编译安装简易操作说明

    环境:CentOS 6.7 安全加固需求,由于某盟扫描系统主机有SSL系列漏洞,客户要求必须修复: 解决方案:将SSH/SSL升级到最新版本,删除SSL旧版本(实测不删除旧版本某盟扫描无法通过). 当 ...

  2. Oracle数据块损坏篇之10231内部事件

    实验:某个分区数据块损坏,不完全恢复此分区表数据 背景:数据库没有有效备份,某个分区中有数据块损坏. 要求:最大限度恢复此分区数据. 环境:RHEL 6.4 + Oracle 11.2.0.4 1. ...

  3. hdu FatMouse's Speed 动态规划DP

    动态规划的解决方法是找到动态转移方程. 题目地址:http://acm.hdu.edu.cn/game/entry/problem/show.php?chapterid=3&sectionid ...

  4. SFC中的故障管理

    1.SFC中包的格式 网络服务包头,当Obit被设置为1时,表示一个SFC OAM消息 OAM Type:SFC OAM的类型(1.连接认证,2.持续性检验,3.路由跟踪,4.性能度量) SFC OA ...

  5. Node.js连接Mysql,并把连接集成进Express中间件中

    引言 在node.js连接mysql的过程,我们通常有两种连接方法,普通连接和连接池. 这两种方法较为常见,当我们使用express框架时还会选择使用中间express-myconnection,可以 ...

  6. [Web API] Web API 2 深入系列(7) Model绑定(下)

    目录 ModelBinder ModelBinderProvider 不同类型的Model绑定 简单类型 复杂类型 其他类型 ModelBinder ModelBinder是Model绑定的核心. p ...

  7. Model验证功能

    占位符  {0}对应属性  {1}对应minimum  {2}对应maximum   [StringLength(15, MinimumLength = 6, ErrorMessage = " ...

  8. ASP.NET MVC入门之再不学习就真的out了

    听说最近又出了什么SAM,MVC辉煌即将过去,惊了我一身冷汗,ASP.NET MVC是啥都还没搞明白呢 于是赶紧打开ASP.NET官网学习学习,欢迎各位高手大侠来指点指点

  9. 【C#公共帮助类】ZipHelper 压缩和解压帮助类,经过实战总结出来的代码

    关于本文档的说明 本文档基于ICSharpCode.SharpZipLib.dll的封装,常用的解压和压缩方法都已经涵盖在内,都是经过项目实战积累下来的 欢迎传播分享,必须保持原作者的信息,但禁止将该 ...

  10. discuz X3.1 关于分表 和 分表数据迁移

    // *********** 关于读取分表的数据*********** { // forum_thread 分表代码片段 -- 帖子列表 { // 定位某个板块的帖子落在哪个表(forum_threa ...