当前位置: 首页 > news >正文

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

个人很喜欢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 节点中为所有页面注册。

看看效果:

2009052117192418.png

怎么样? 是不是很爽?

 

本文源码下载:RepeaterInMvc.zip

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

相关文章:

  • django 一对一, 一对多,多对多的领悟
  • [转]ASP.NET Core: Static Files cache control using HTTP Headers
  • VMware HA实战攻略之五VMwareHA测试验收
  • Java的Cloneable接口还有深浅复制
  • WSUS系列之第三版部署
  • 一篇你看了就懂的DNS详解
  • 使用TripleDES算法加密/解密
  • Sql Server函数全解(二)数学函数
  • IT维护部门的绩效考核怎么做?
  • cs20_8-1
  • 恢复Linux系统里被删除的 Ext3文件
  • Python基础之函数
  • Picturing virtual functions
  • C# 预处理指令
  • 安装Asp.net 2.0服务器出现Server Application Unavailabl --zt
  • CentOS7 安装JDK
  • eclipse(luna)创建web工程
  • JavaScript HTML DOM
  • Joomla 2.x, 3.x useful code cheatsheet
  • js ES6 求数组的交集,并集,还有差集
  • mysql innodb 索引使用指南
  • mysql外键的使用
  • 阿里云前端周刊 - 第 26 期
  • 阿里云应用高可用服务公测发布
  • 百度地图API标注+时间轴组件
  • 诡异!React stopPropagation失灵
  • 回顾2016
  • 面试遇到的一些题
  • 如何用vue打造一个移动端音乐播放器
  • 什么是Javascript函数节流?
  • 算法-插入排序
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 新版博客前端前瞻
  • 一文看透浏览器架构
  • ​Spring Boot 分片上传文件
  • #Linux(Source Insight安装及工程建立)
  • $().each和$.each的区别
  • (1)常见O(n^2)排序算法解析
  • (14)Hive调优——合并小文件
  • (arch)linux 转换文件编码格式
  • (HAL库版)freeRTOS移植STMF103
  • (四)c52学习之旅-流水LED灯
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (转)mysql使用Navicat 导出和导入数据库
  • .axf 转化 .bin文件 的方法
  • .java 9 找不到符号_java找不到符号
  • .NET6 命令行启动及发布单个Exe文件
  • .NET和.COM和.CN域名区别
  • .NET中 MVC 工厂模式浅析
  • .Net转Java自学之路—SpringMVC框架篇六(异常处理)
  • /bin/bash^M: bad interpreter: No such file ordirectory
  • [20171101]rman to destination.txt
  • [BT]BUUCTF刷题第8天(3.26)
  • [C#] 如何调用Python脚本程序
  • [C]整形提升(转载)