zoukankan      html  css  js  c++  java
  • 第5章 自定义分页

    第5章 自定义分页

    clip_image004

    5.1 深入模型

    5.1.1 复杂模型绑定规则

    1.模型包含模型

    2.集合对象作为模型

    >venders[0].SpCode

    3.模型包含集合对象

    5.1.2 定制模型绑定的属性

    1.在动作方法参数上应用Bind特性

    示例:

    >public ActionResult Register([Bind(Include=”UserName,Password”)User

    >user){…}

    >public ActionResult Register([Bind(Exclude=”Email”)User user]){…}

    使用Include只绑定哪些属性,Exclude是除此之外绑定哪些属性。Bind还有

    一个属性Prefix,使用它可以制定符合命名规则的元素绑定,即凡是元素的name

    满足该前缀要求的,都可以完成对应属性的自动绑定。

    2.在模型类上应用绑定特性

    应用与前面规则一致。

    3.使用Model绑定方法

    方法:

    >void UpdateModel<TModel>(TModel model,

    >string prefix,string[] includeProperties,string excudeProperties)

    >void TryUpdateModel(TModel model,

    >string prefix,string[] includeProperties,string excudeProperties)

    5.1.3 自定义模型绑定器

    实现自定义绑定类,需要实现System.Web.Mvc.IModelBinder接口,该接口

    包含唯一的成员方法,如下所示。

    >object BindModel(ControllerContext controllerContext,

    >ModelBindingContext bindingContext);

    示例:

    public class UserBinder:IModelBinder{

    public object BindModel(ControllerContext controllerContext,

    ModelBindingContext bindingContext)

    {

    var user = (User)bindingContext.Model ?? new User();

    user.UserName = GetValue<string>(bindingContext, "UserName");

    user.Password = GetValue<string>(bindingContext, "Password");

    user.Email = user.UserName + "@163.com";

    return user;

    }

    private T GetValue<T>(ModelBindingContext bindingContext, string key)

    {

    ValueProviderResult valueResult =

    bindingContext.ValueProvider.GetValue(key);

    return (T)valueResult.ConvertTo(typeof(T));

    }

    }

    public ActionResult Register(

    [ModelBinder(typeof(UserBinder))]User user){ }

    5.1.4分解模型

    public partial class User

    {

    public string LoginId { get; set; }

    public string LoginPwd { get; set; }

    }

    [MetadataType(typeof(UserMetaData))]

    public partial class User

    {

    [DisplayName("重复密码")]

    [Required(ErrorMessage = "重复密码不得为空")]

    [Compare("LoginPwd", ErrorMessage = "密码必须一致")]

    public string PasswordConfirm { get; set; }

    public class UserMetaData

    {

    [DisplayName("密码")]

    [Required(ErrorMessage = "密码不得为空")]

    public string LoginPwd{get;set;}

    }

    }

    5.2 方法进阶

    5.2.1 扩展方法

    1.定义扩展方法

    语法:

    >static class 静态类名

    >{

    > static 返回类型 扩展方法名(this 扩展的类型 对象名,[其他参数列表])

    > {

    > //扩展方法代码

    > }

    >}

    示例:

    public static class StringExt

    {

    public static bool IsInt(this String str)

    {

    int i;

    return int.TryParse(str, out i);

    }

    }

    static void Main(string[] args)

    {

    String str="123";

    if(str.IsInt())

    {

    Console.Write(str+"是整数");

    }

    }

    2.扩展HtmlHelper

    public static string Submit(this HtmlHelper helper,

    string name, string value,object htmlAttributes)

    {

    var builder = new TagBuilder("input");

    builder.MergeAttribute("type", "submit");

    builder.MergeAttribute("value", value);//设置value 属性

    builder.MergeAttribute("name", name);//设置name 属性

    builder.GenerateId(name);//设置id 属性

    builder.MergeAttributes(

    new RouteValueDictionary(htmlAttributes));//设置其他 属性

    return builder.ToString();

    }

    <%=Html.Submit("login", "登入",

    new { @class="opt_sub",title="点击提交"})%>

    编写HtmlHelper方法的关键类和方法

    名称

    用途

    TagBuilder类

    用于辅助创建标记

    MergeAttribute()

    用于向标记对象中添加1个属性

    MergeAttributes()

    用于向标记对象中添加多个属性

    GenerateId()

    用于产生标记的Id元素

    5.2.2 泛型方法

    语法:

    访问修饰符 返回类型 方法名<T>(T 参数名){方法体}

    clip_image001 泛型的优势

    clip_image002 类型安全

    clip_image002[1] 提高代码复用

    5.3 自定义分页

    5.3.1 分页数据源类

    示例:

    using System;

    using System.Collections.Generic;

    using System.Linq;

    namespace BookShop.Helpers

    {

    public class PagedList<T> : List<T>

    {

    /// <summary>

    /// 页索引

    /// </summary>

    public int PageIndex { get; private set; }

    /// <summary>

    /// 页大小

    /// </summary>

    public int PageSize { get; private set; }

    /// <summary>

    /// 总数据条数

    /// </summary>

    public int TotalCount { get; private set; }

    /// <summary>

    /// 总页数

    /// </summary>

    public int TotalPages { get; private set; }

    public PagedList(List<T> source, int pageIndex, int pageSize)

    {

    PageIndex = pageIndex;

    PageSize = pageSize;

    TotalCount = source.Count();

    TotalPages = (int)Math.Ceiling(TotalCount / (double)PageSize);

    this.AddRange(source.Skip((PageIndex-1) * PageSize).Take(PageSize));

    }

    /// <summary>

    /// 是否包含上一页

    /// </summary>

    public bool HasPreviousPage

    {

    get

    {

    return (PageIndex > 1);

    }

    }

    public bool HasNextPage

    {

    get

    {

    return (PageIndex < TotalPages);

    }

    }

    }

    }

    5.3.2 使用扩展方法改进分页

    示例:

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using System.Web.Mvc.Html;

    using System.Web.Routing;

    using BookShop.Helpers;

    namespace System.Web.Mvc

    {

    public static class PagerExtension

    {

    public static string Pager<T>(this HtmlHelper html, PagedList<T> data)

    {

    //数字导航的开始数字

    int start = (data.PageIndex - 5) >= 1 ? (data.PageIndex - 5) : 1;

    //数字导航的结束数字

    int end = (data.TotalPages - start) > 10 ? start + 10 : data.TotalPages;

    //路由数据

    RouteValueDictionary vs = html.ViewContext.RouteData.Values;

    //URL数据

    var queryString = html.ViewContext.HttpContext.Request.QueryString;

    //合并URL数据

    foreach (string key in queryString.Keys)

    if (queryString[key] != null && !string.IsNullOrEmpty(key))

    vs[key] = queryString[key];

    //合并表单数据

    var FormString = html.ViewContext.HttpContext.Request.Form;

    foreach (string key in FormString.Keys)

    vs[key] = FormString[key];

    //输出分页Html

    var builder = new StringBuilder();

    builder.AppendFormat("<div class="mvc_pager">");

    //显示首页和上页

    if (data.HasPreviousPage)

    {

    vs["pageIndex"] = 1;

    builder.Append(LinkExtensions.ActionLink(html, "首页", vs["action"].ToString(), vs));

    vs["pageIndex"] = data.PageIndex - 1;

    builder.Append(LinkExtensions.ActionLink(html, "上页", vs["action"].ToString(), vs));

    }

    //显示数字页码

    for (int i = start; i <= end; i++)

    {

    vs["pageIndex"] = i;

    if (i == data.PageIndex)

    {

    builder.Append("<font class='thispagethis'>" + i.ToString() + "</font>");

    }

    else

    {

    builder.Append(LinkExtensions.ActionLink(html, i.ToString(), vs["action"].ToString(), vs));

    }

    }

    //显示下页和末页

    if (data.HasNextPage)

    {

    vs["pageIndex"] = data.PageIndex + 1;

    builder.Append(LinkExtensions.ActionLink(html, "下页", vs["action"].ToString(), vs));

    vs["pageIndex"] = data.TotalPages;

    builder.Append(LinkExtensions.ActionLink(html, "末页", vs["action"].ToString(), vs));

    }

    builder.Append("共" + data.TotalCount + "条 第" + data.PageIndex + "页/共" + data.TotalPages + "页 </div>");

    return builder.ToString();

    }

    }

    }

    5.5 展示下拉框列表

    5.5.1 使用IEnumerable<SelectListItem>作为数据源

    示例:

    <% var items = new List<SelectListItem>();

    items.Add(new SelectListItem() { Text = "北京", Value = "1" });

    items.Add(new SelectListItem() {

    Text = "上海", Value = "2",Selected=true});

    items.Add(new SelectListItem() { Text = "天津", Value = "3" });

    items.Add(new SelectListItem() { Text = "重庆", Value = "4" });

    items.Add(new SelectListItem() { Text = "广州", Value = "5" });

    %>

    <%=Html.DropDownList("area",items,"请选择") %>

    5.5.2 使用SelectList作为数据源

    示例:

    public SelectList(IEnumerable items, string dataValueField,

    string dataTextField, object selectedValue)

    List<City> cities = GetCities();//获取泛型集合对象

    SelectList list = new SelectList(cities, "Id", "Name", cities[1].Id);

    <%=Html.DropDownList("area",list,"请选择") %>

  • 相关阅读:
    C#命名约定:PascalCase和camelCase
    Windows8 App 四大名著完整本 隐私保护声明
    C#-编码习惯
    [转]C#之Console.Write()和Console.Read()及Console.Readline()的问题
    通过JavaScript动态输入计算
    在VS2008中加入ExtJS智能提示—>(方法一)
    在VS2008中加入ExtJS智能提示—>(方法二)
    (一)javascript面向对象:(1)类
    上证指数波浪分析2013/03/12
    Springsecurity源码Filter之HeaderWriterFilter(十二)
  • 原文地址:https://www.cnblogs.com/xuzhen97/p/8866636.html
Copyright © 2011-2022 走看看