您的位置:首页 > 编程语言 > ASP

[Mvc]在ASP.NET MVC中使用Repeater

2020-03-04 23:03 951 查看

个人很喜欢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;
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 = "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();
        }

 

再看看页面代码:

<%@ 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>

 
注意:<%@ Register Assembly="RepeaterInMvc" Namespace="RepeaterInMvc.Codes" TagPrefix="mvc" %>
在当前页面注册控件!!!   当然,你也可以在 web.config 中的 page/controls 节点中为所有页面注册。

看看效果:

怎么样? 是不是很爽?

 

本文源码下载:RepeaterInMvc.zip

转载于:https://www.cnblogs.com/Kagilo/archive/2009/05/21/mvc-repeater.html

  • 点赞
  • 收藏
  • 分享
  • 文章举报
a864866138 发布了0 篇原创文章 · 获赞 0 · 访问量 12 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: