首页  ·  知识 ·  云计算
在Asp.netMVC中使用Repeater
网友  收集  综合  编辑:德仔   图片来源:网络
1. Repeater需要手动去绑定数据。 意思是说我们要在View当中写 服务端代码,先从ViewData中取得数据,再去绑定到Repeater。
 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 节点中为所有页面注册。
本文作者:网友 来源:网络收集
CIO之家 www.ciozj.com 微信公众号:imciow
   
免责声明:本站转载此文章旨在分享信息,不代表对其内容的完全认同。文章来源已尽可能注明,若涉及版权问题,请及时与我们联系,我们将积极配合处理。同时,我们无法对文章内容的真实性、准确性及完整性进行完全保证,对于因文章内容而产生的任何后果,本账号不承担法律责任。转载仅出于传播目的,读者应自行对内容进行核实与判断。请谨慎参考文章信息,一切责任由读者自行承担。
延伸阅读