个人很喜欢MVC这种开发模式,非常的方便,结构很清晰。
但是在MVC下面,View与代码是完全分离了,也没有了服务端的FORM,意味着几乎所有的服务器控件都无法使用!(内幕:其实本人基本上从来不使用服务端表单,即使在MVP模式下)
在MVC的View当中,基本上我们只有自己使用 for foreach 这样的循环来输出数据了,内容少的也还好,但是多的话,就显得很麻烦了。
虽然这样很灵活,但是看到一段的<%%>也挺头痛的,所以,想想~~ 有没有什么办法使用服务端控件?而且不要使用服务端的表单(Form)。
首先想到的是Repeater,Repeater是一个很好用的服务器控件,使用起来很方便。本人很是喜欢。而且Repeater有一个特点,不依懒服务端表单(Form)。
所以,我想,能不能把Repeater用到Mvc当中~~~ 答案是肯定的。但是好像使用起来很麻烦。
麻烦有以下几点:
1. Repeater需要手动去绑定数据。 意思是说我们要在View当中写 服务端代码,先从ViewData中取得数据,再去绑定到Repeater。
2. 如果一个页面用到n+1个Repeater,那会不会疯掉? 而且要给每一个Repeater指定 Id,必去绑数据,头痛啊!!!
那么~~ 我们可不可以让Repeater用起来简单点呢? 我们来对Repeater进行一下改造,达到我们的目的。
我们都知道在Mvc当中,我们使用 ViewData 来传递数据,那可不可以直接让Repeater 绑定 ViewData 中的数据呢? 当然可以
看改造后的 Repeater 源码:
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI.WebControls;
using System.Web.Mvc;
namespace RepeaterInMvc.Codes
{
public class MvcRepeater : Repeater
{
/// <summary>
/// ViewData中的键名
/// </summary>
public string Key { get ; set ; }
/// <summary>
/// 得到ViewPage对象
/// </summary>
protected ViewPage ViewPage
{
get { return base .Page as ViewPage; }
}
/// <summary>
/// 重写Onload事件 用于绑定数据
/// </summary>
/// <param name="e"></param>
protected override void OnLoad(EventArgs e)
{
this .DataSource = this .ViewPage.ViewData[ this .Key]; // 得到数据源
this .DataBind(); // 绑定 这样就不用手动写N个绑定了
base .OnLoad(e);
}
}
}
上面的代码做了什么:
1. 添加了一个公共属性 Key ,表示这个Repeater要绑定 ViewData 中哪一项数据。
2. 添加了一个保护属性 ViewPage ,指向了当前的 Page 对象 并强制转换成 Mvc 的 ViewPage对象 (因为我们要得到ViewData或其它Mvc相关的上下文信息)
3. 重写了 OnLoad 事件,重写这个事件,用来绑定数据,免得我们需要在View中手动绑定每一个Repeater,那多烦啊。
现在我们的目的已经达到了。看看怎么使用吧:
控制器代码:
{
// 来点测试数据
List < Models.TestInfo > entities = new List < RepeaterInMvc.Models.TestInfo > ();
entities.Add( new RepeaterInMvc.Models.TestInfo { Id = 1 , Name = " Kagilo1 " , Email = " Kagilo@126.com " });
entities.Add( new RepeaterInMvc.Models.TestInfo { Id = 2 , Name = " Kagilo2 " , Email = " Kagilo@126.com " });
entities.Add( new RepeaterInMvc.Models.TestInfo { Id = 3 , Name = " Kagilo3 " , Email = " Kagilo@126.com " });
entities.Add( new RepeaterInMvc.Models.TestInfo { Id = 4 , Name = " Kagilo4 " , Email = " Kagilo@126.com " });
entities.Add( new RepeaterInMvc.Models.TestInfo { Id = 5 , Name = " Kagilo5 " , Email = " Kagilo@126.com " });
ViewData[ " TestList " ] = entities;
return View();
}
再看看页面代码:
< asp:Content ID = " indexTitle " ContentPlaceHolderID = " TitleContent " runat = " server " >
Home Page
</ asp:Content >
< asp:Content ID = " indexContent " ContentPlaceHolderID = " MainContent " runat = " server " >
< h2 > Repeater示例 </ h2 >
< p >
< mvc:MvcRepeater Key = " TestList " runat = " server " >
< ItemTemplate >
< div style = " height:30px; line-height:30px; " ><% # Eval( " Id " ) %> , <% # Eval( " Name " ) %> , <% # Eval( " Email " ) %></ div >
</ ItemTemplate >
< AlternatingItemTemplate >
< div style = " height:30px; line-height:30px; background:#eeeeee; " ><% # Eval( " Id " ) %> , <% # Eval( " Name " ) %> , <% # Eval( " Email " ) %></ div >
</ AlternatingItemTemplate >
</ mvc:MvcRepeater >
</ p >
</ asp:Content >
注意:<%@ Register Assembly="RepeaterInMvc" Namespace="RepeaterInMvc.Codes" TagPrefix="mvc" %>
在当前页面注册控件!!! 当然,你也可以在 web.config 中的 page/controls 节点中为所有页面注册。
看看效果:
怎么样? 是不是很爽?
本文源码下载:RepeaterInMvc.zip