管理员
|
阅读:4221回复:0
在Asp.net MVC中使用Repeater
楼主#
更多
发布于:2011-12-15 22:04
 | |  |  | 1. Repeater需要手动去绑定数据。 意思是说我们要在View当中写 服务端代码,先从ViewData中取得数据,再去绑定到Repeater。
2. 如果一个页面用到n+1个Repeater,那会不会疯掉? 而且要给每一个Repeater指定 Id,必去绑数据,头痛啊!!! 那么~~ 可不可以让Repeater用起来简单点呢? 来对Repeater进行一下改造,达到目的。
在Mvc当中,使用 ViewData 来传递数据,那可不可以直接让Repeater 绑定 ViewData 中的数据呢? 当然可以
看改造后的 Repeater 源码:
using System; 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,那多烦啊。
现在我们的目的已经达到了。看看怎么使用吧:
控制器代码:
public ActionResult Index() { //来点测试数据 List<Models.TestInfo> entities = new List<RepeaterInMvc.Models.TestInfo>();
entities.Add(new RepeaterInMvc.Models.TestInfo { Id = 1, Name = "Kagilo1", Email = "1@1.com" }); entities.Add(new RepeaterInMvc.Models.TestInfo { Id = 2, Name = "Kagilo2", Email = "1@1.com" }); entities.Add(new RepeaterInMvc.Models.TestInfo { Id = 3, Name = "Kagilo3", Email = "1@1.com" }); entities.Add(new RepeaterInMvc.Models.TestInfo { Id = 4, Name = "Kagilo4", Email = "1@1.com" }); entities.Add(new RepeaterInMvc.Models.TestInfo { Id = 5, Name = "Kagilo5", Email = "1@1.com" });
ViewData["TestList"] = entities; return View(); }
再看看页面代码:
<%@ Register Assembly="RepeaterInMvc" Namespace="RepeaterInMvc.Codes" TagPrefix="mvc" %>
<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>
TPS :<%@ Register Assembly="RepeaterInMvc" Namespace="RepeaterInMvc.Codes" TagPrefix="mvc" %>
在当前页面注册控件!!! 当然,你也可以在 web.config 中的 page/controls 节点中为所有页面注册。
| |  | |  |
|