Asp.net Mvc 中使用Repeater的6种解决方案

简介:

请先阅读这里:

ASP.NET Framework Features That Are Compatible with MVC

It might appear that Web Forms and MVC are very different technologies. However, both of these technologies are built on the ASP.NET framework. Therefore, most ASP.NET framework features that you have used to create applications that are based on Web Forms are also available to you for developing MVC applications. This includes features such as membership, authentication, roles, and configuration, which work the same way in an MVC application as they do in a Web Forms application. Most ASP.NET namespaces, classes, and interfaces can be used in an ASP.NET MVC application.

 ASP.NET Framework Features That Are Incompatible with MVC

Because ASP.NET MVC does not maintain state information by using view state, you must find other ways to manage state information, if you need it. In addition, server controls that rely on view state and postback will not work as designed in an ASP.NET MVC application. Therefore, you should not use controls such as the GridViewRepeater, and DataList controls.

源文档 <http://msdn.microsoft.com/en-us/library/dd381619.aspx>

 

准备工作:

复制代码
// 一个Student类:
  public   class  Student
    {
        
public   int  Number {  get set ; }
        
public   string  Name {  get set ; }
    }
// Dummy Data构造的绑定数据如下:
  List < Student >  students  =   new  List < Student > ();
 students.Add(
new  Student { Name  =   " lee " , Number  =   123  });
 students.Add(
new  Student { Name  =   " Zen " , Number  =   234  });
 students.Add(
new  Student { Name  =   " angle " , Number  =   101  });
 ViewData[
" Students " =  students;
复制代码

 

问题是什么?

      View中使用Repeater的问题其实就是绑定事件的执行,明确了这一点其实问题就很简单了.

 

方案一:页面级解决

我们设计一个View的基类,该基类在页面Load的时候完成DataBind,这样不管页面中有没有需要绑定的控件,需要绑定的控件是什么,这个方法执行完之后就会完成绑定.首先验证我们的想法:

 

复制代码
// View基类
public   class  AutoBindViewPage : ViewPage
{
    
protected   override   void  OnLoad(EventArgs e)
    {
      
this .DataBind();    
      
base .OnLoad(e);
    }
}
复制代码

页面代码片段:

 

复制代码
<% @ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="AutoBindViewPage"  %>

< asp:Content  ID ="Content1"  ContentPlaceHolderID ="TitleContent"  runat ="server" >
    Helloworld
</ asp:Content >
< asp:Content  ID ="Content2"  ContentPlaceHolderID ="MainContent"  runat ="server" >
    
< h2 >
        Repeater Test
</ h2 >
    
<% = Html.Encode(ViewData[ " Students " ]) %> < br  />
    
< asp:Repeater  ID ="Repeater1"  DataSource ='<%#ViewData["Students"]% > ' runat="server">
        
< ItemTemplate >
            Name:
<% #Eval("Name") %> < br  />
        
</ ItemTemplate >
    
</ asp:Repeater >

</ asp:Content >
复制代码

  

注意:Inherits="AutoBindViewPage"

跑一下程序,成功.

原理:

我们看一下继承关系:AutoBindViewPage-->ViewPage-->Page-->TemplateControl-->Control

考察一下Control类的DataBind事件:

 

复制代码
protected   virtual   void  DataBind( bool  raiseOnDataBinding)
{
    
bool flag = false;
    
if (this.IsBindingContainer)
    
{
        
bool flag2;
        
object dataItem = DataBinder.GetDataItem(thisout flag2);
        
if (flag2 && (this.Page != null))
        
{
            
this.Page.PushDataBindingContext(dataItem);
            flag 
= true;
        }

    }

    
try
    
{
        
if (raiseOnDataBinding)
        
{
            
this.OnDataBinding(EventArgs.Empty);
        }

        
this.DataBindChildren();
    }

    
finally
    
{
        
if (flag)
        
{
            
this.Page.PopDataBindingContext();
        }

    }

}


 
复制代码

 

 关键就在这里:this.DataBindChildren();

 

 方案二:AutoBindRepeater

     扩展ViewPage不是什么好主意,"Repeater绑定"看做一个职责,那么这个职责应该属于Repeater自己的.想到这里也就简单了,删除掉刚刚扩展的类,实现一个AutoBindRepeater:

 

复制代码
namespace  TestControls
{
    {
        
protected   override   void  OnLoad(EventArgs e)
        {
            
this .DataBind();
                 
base .OnLoad(e);
        }
    }
}
复制代码

 

 

页面代码片段:

 

 

复制代码
<% @ Page Language = " C# "  MasterPageFile = " ~/Views/Shared/Site.Master "  Inherits = " System.Web.Mvc.ViewPage "   %>

<% @ Register Namespace = " TestControls "  Assembly = " ZenMvc "  TagPrefix = " My "   %>
 … … 
< My:AutoBindRepeater  DataSource ='<%#ViewData["Students"]% > ' runat="server">
        
< ItemTemplate >
            Name:
<% # Eval ( " Name " ) %> < br  />
        
</ ItemTemplate >
    
</ My:AutoBindRepeater >
复制代码

跑一下,通过.

 

方案三:AutoBindRepeaterUseDataKey

方案三其实是做一点简单的改造,可以看到 DataSource='<%#ViewData["Students"]%>'在每一个Repeater中都是重复的,改造的目的就是为了简化这一语句.方法也很简单:添加对数据源的解析就可以.

 

复制代码
  public   class  AutoBindRepeaterUseDataKey : System.Web.UI.WebControls.Repeater
    {
        
private   string  _dataKey;
        
public   string  DataKey
        {
            
get  {  return  _dataKey; }
            
set  { _dataKey  =  value; }
        }
        
protected   override   void  OnLoad(EventArgs e)
        {
            ViewPage viewPage 
=  (System.Web.Mvc.ViewPage)Page;
            
this .DataSource  =  viewPage.ViewData[DataKey];
            
this .DataBind();
                  
base .OnLoad(e);
        }
    }

复制代码

 

页面代码片段:

 

  < My:AutoBindRepeaterUseDataKey  DataKey ="Students"   runat ="server" >
        
< ItemTemplate >
            Name:
<% # Eval ( " Name " ) %>   &nbsp;&nbsp;
            Number:
<% # Eval ( " Number " %> < br  />
        
</ ItemTemplate >
 
</ My:AutoBindRepeaterUseDataKey >

 

调试,通过.

 

方案四:MVCRepeater

       细心地你一定发现了,在上面的改造中,我们已经在标准的Repeater实现中引入了MVC框架的内容.MvcFutures项目中的Microsoft.Web.Mvc.Controls里面,我们找到了一个MVCRepeater的实现:

 

<% @ Register Assembly = " Microsoft.Web.Mvc "  Namespace = " Microsoft.Web.Mvc.Controls "  TagPrefix = " MVC "    %>
 
< MVC:Repeater   Name ="Students"  runat ="server"   >
    
< ItemTemplate >
     Name:
<% # Eval ( " Name " ) %> < br  />
    
</ ItemTemplate >
    
</ MVC:Repeater >

 

MVCRepeater的实现略. 

方案五:foreach语句

 

 继续追究为什么要使用Repeater,是因为我们要展示一组数据,走到这里我们的调整一下目标,不再是在MVC使用Repeater控件,而是实现在asp.net MVC 中展示一组数据.

foreach语句具有相当好的表现力:

 

  <% foreach (var item in (List < Student > )ViewData[ " Students " ]){ %>
          [Name]: 
<% = item.Name %> < br />
      
<% %>

 

方案五:MvcContrib Grid & SparkViewEngine

全面考虑MvcContrib GridSparkViewEngine也是具有技术可行性.但是是否要引入到项目中要谨慎考虑.

 

复制代码
<% =  Html.Grid(Model.People).Columns(column  =>  {
             column.For(x 
=>  x.Id).Named( " Person ID " );
             column.For(x 
=>  x.Name);
             column.For(x 
=>  x.DateOfBirth).Format( " {0:d} " );
         })
        .Attributes(style 
=>   " width:100% " )
         .Empty(
" There are no people. " )
         .RowStart(row 
=>   " <tr foo='bar'> " %>
复制代码

 

源文档 <http://www.jeremyskinner.co.uk/2009/02/22/rewriting-the-mvccontrib-grid-part-2-new-syntax/>

 

复制代码
< viewdata  products ="IEnumerable[[Product]]" />
< ul  if ="products.Any()" >
  
< li  each ="var p in products" > ${p.Name} </ li >
</ ul >
< else >
  
< p > No products available </ p >
</ else >
复制代码

 

源文档 <http://sparkviewengine.com/>

 

嗯哼,全文完.

目录
相关文章
|
26天前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
86 3
|
22天前
|
监控 网络安全 调度
Quartz.Net整合NetCore3.1,部署到IIS服务器上后台定时Job不被调度的解决方案
解决Quartz.NET在.NET Core 3.1应用中部署到IIS服务器上不被调度的问题,通常需要综合考虑应用配置、IIS设置、日志分析等多个方面。采用上述策略,结合细致的测试和监控,可以有效地提高定时任务的稳定性和可靠性。在实施任何更改后,务必进行充分的测试,以验证问题是否得到解决,并监控生产环境的表现,确保长期稳定性。
35 1
|
2月前
|
存储 安全 物联网
.NET 跨平台工业物联网网关解决方案
【9月更文挑战第28天】本文介绍了利用 .NET 构建跨平台工业物联网网关的解决方案。通过 .NET Core 和多种通信协议(如 MQTT 和 Modbus),实现工业设备的高效接入和数据采集。系统架构包括设备接入层、数据处理层、通信层、应用层和数据库层,确保数据的准确采集、实时处理和安全传输。此外,还详细阐述了设备身份认证、数据加密及安全审计等机制,确保系统的安全性。该方案适用于不同操作系统和工业环境,具备高度灵活性和扩展性。
|
2月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
38 7
|
2月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
53 0
|
3月前
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
46 0
|
3月前
|
开发框架 前端开发 安全
ASP.NET MVC 如何使用 Form Authentication?
ASP.NET MVC 如何使用 Form Authentication?
|
前端开发 数据安全/隐私保护
net MVC中的模型绑定、验证以及ModelState
net MVC中的模型绑定、验证以及ModelState 模型绑定 模型绑定应该很容易理解,就是传递过来的数据,创建对应的model并把数据赋予model的属性,这样model的字段就有值了。
1692 0
|
3月前
|
开发框架 .NET
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
119 0
|
6月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
189 0