第5章 自定义分页
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 参数名){方法体}
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,"请选择") %>