第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,"请选择") %>

原文地址:https://www.cnblogs.com/xuzhen97/p/8866636.html