petshop里的CustomList是个什么东西?

UE4游戏开发:GameInstance与GameMode的实战应用与避坑指南 本文深入解析了UE4中GameInstance与GameMode的核心差异与实战应用。GameInstance作为贯穿游戏进程的全局单例,负责跨关卡数据持久化与系统管理;而GameMode则定义特定关卡内的游戏规则与逻辑,随关卡加载销毁。文章通过数据存储、动态模式切换及网络游戏等场景,提供了清晰的应用指南与常见避坑方案,帮助开发者构建更健壮的UE4游戏架构。 阅读详情

简单明白地讲讲petshop4的多层应用是如何实现的:1)数据怎么取得

我知道有很多高手写了讲这个问题的文章,但我认我太菜,看不懂他们讲的那些,他们多数是从“架构和设计”角度讲,我不是技术总监,不需要知道这些,我需要知道的是如何用vs2005实现自己的多层应用,我希望能有高人从下面讲的角度入手讲解一下。不必讲多高深,也不必告诉我让我去看书,谢谢。

简单说,问题是:页面的内容是怎么从数据库中动态产生出来的?而且还是多层的?那些工厂类之类的东西,到底是多层的要素还是技术花招和迷雾?与这个“多层”有多大的关系?一个最简单的多层该是什么样的呢?希望高人能帮我拨开迷雾。

我思考和分析这问题是这样进行的:
在products.aspx文件中,用了母板页和内容页结构。母版页里有 contentplaceholder控件,这可以从工具箱的标准抽屉中拖到设计器上。在内容页(也就是products.aspx了)里,主要就是一个content,是用户定义的,这里又有用户定义的内容控件,叫customlist-productslist。形如:

<asp:Content ID="cntPage" ContentPlaceHolderID="cphPage" runat="Server" EnableViewState="false">  
    <PetShopControl:ProductsControl ID="ProductsControl1" runat="server" OnLoad="ProductsControl1_Load" />
</asp:Content>

这里是要用这个content去填充母板里的那个contentplaceholder所定的区域。
而内容本身又是从哪里来的呢?内容体是这段:

<PetShopControl:ProductsControl ID="ProductsControl1" runat="server" OnLoad="ProductsControl1_Load" />

这是一个从解决方案资源管理器中拖放出来的东西。具体是将control目录下的productscontrol拖过来就可以了。

好了,这样,我们的问题就集中到productscontrol的设计上了。

我找到controls/productscontrol.ascx,双击它,来研究它在设计器和源编辑器中的样子。

在设计器中,看到一个customlist-productslist,这个东西也该算控件吧,不过在工具箱中是没有的,算用户控件吧。试图找到一个可以拖放它的方法,未果。那么它是怎么跑到设计器上去的呢?

暂时放下它是怎么跑到设计器上的这个问题,先看看它到底是个什么东西。

在设计器上,看其属性,是petshop.web.customlist,这像是个用户定义的类或者说组件。右键点它,在快捷菜单上有几个可能有点击价值的选项:查看代码、查看组件设计器、编辑模板-项模板。
至于其属性,已经自动显示在属性管理窗口中了。

点‘查看代码’,结果就看到productslist.cs文件内容。和在解决方案资源管理器中双击这个文件一样效果。这里,定义了 productslist的部分内容:public partial class ProductsControl : System.Web.UI.UserControl {
注意这个partial,意思是还有其它定义内容在别的文件里。也就是说,一个类可以五马分尸并放到不同文件里了,据说这样对编程者有若干好处,不知道又没有坏处?这里主要定义了当页号改变时,内容要相应重新从数据库中得到,以及页面加载时,数据是怎么获得的。这两函数是pagechanged()和page_load()。

先不考虑研究pagechanged的问题,集中力量看看page_load的问题。

protected void Page_Load(object sender, EventArgs e) {
            this.CachePolicy.Dependency = DependencyFacade.GetProductDependency();
        }

而这里,引入了一个新玩艺:cachedependency,这是个什么东西?多层应用一定要用这个新式武器吗?原来,这是.net2.0引入的缓存机制。当页面装载时,先看看服务器缓存里有没有需要的东西,这里缓存的可能是装配好了的页面html。

暂时不管它,继续猜测。看这个事件的处理,看不出哪里去取数据了,估计这页面load事件后,紧接着就是pagechanged事件,所以取数据的活包给pagechanged事件处理函数了。

在pagechanged()里:
        protected void PageChanged(object sender, DataGridPageChangedEventArgs e) {
            //reset index
            productsList.CurrentPageIndex = e.NewPageIndex;

            //get category id
            string categoryKey = Request.QueryString["categoryId"];

            //bind data
            Product product = new Product();
            productsList.DataSource = product.GetProductsByCategory(categoryKey);
            productsList.DataBind();

        }

在bind data段里,是获取数据的实际工作。看来,这里又用了个新类:product。这个类负责把数据取得。于是我们继续追综product类。

namespace PetShop.BLL
{
    public class Product
    {
        public Product();

        public ProductInfo GetProduct(string productId);
        public IList<ProductInfo> GetProductsByCategory(string category);
        public IList<ProductInfo> GetProductsBySearch(string text);
    }
}

这个类玩了个花招,用了IList<>,这个IList就是IndexedList,意思是说可以根据索引访问的列表。
那个尖角括号是说,这里用了泛型,换个熟悉的词,就是模板吧。
public IList<ProductInfo> GetProductsByCategory(string category)看起来有点专家派头啊,用人民大众能听懂的词汇来说呢,就是说:有一个函数叫getproductsbycategory,它的参数是category,它返回的是productinfo作元素的的可索引的列表。既然是列表,就不是一般的数组,数组倒是可以根据索引来访问其元素,但数组不能随意扩展,而IList可以有随意个元素,而且,IList有现成的方法可以用。

好了,回到实际问题,在pagechanged时,发生
      productsList.DataSource = product.GetProductsByCategory(categoryKey);这个事情,这样,就把productslist里面的datasource填满了。

然而,我们还需要搞清,这里还有一个productslist类,而这是位什么神仙呢?换句话说,它有什么武功呢?右键点它,转到定义,可惜,对象定义被隐藏。这是什么秘籍?

看productscontrol.ascx文件,里面有:
<PetShopControl:CustomList ID="productsList" runat="server" EmptyText="No products found." OnPageIndexChanged="PageChanged" PageSize="4" RepeatColumns="2" CellPadding="16" CellSpacing="0" Width="500px">  

可见这里有ASP.net2的方言。翻译过来就是说:有一个customlist,给它起了个马甲叫productslist。。。晕。这是位customlist神仙。那么,我们去看customlist有什么武功吧。

而customlist就是个纯手工作品了。存在于app_code目录,文件名:CustomList.cs

 public class CustomList : DataList {
        //Static constants
        protected const string HTML1 = "<table cellpadding=0 cellspacing=0><tr><td colspan=2>";
        protected const string HTML2 = "</td></tr><tr><td class=paging align=left>";
        protected const string HTML3 = "</td><td align=right class=paging>";
      。。。。。。。。。

原来,customlist它爹是datalist。datalist它妈可是微软啊,略窥一下datalist的武功:

namespace System.Web.UI.WebControls
{
       public class DataList : BaseDataList, INamingContainer, IRepeatInfoUser
    {
        public const string CancelCommandName = "Cancel";
        public const string DeleteCommandName = "Delete";
        public const string EditCommandName = "Edit";
        public const string SelectCommandName = "Select";
        public const string UpdateCommandName = "Update";

。。。。。
凭这些武功,datalist在工具箱-数据抽屉 里有正式工作岗位。它是个可视化控件。

不过,customlist基于datalist添加了些花样,看上面的代码可以看到它用了些html元素当成员。

好了,回到本问题:数据怎么从数据库到内容页的?

基本上是:在products.aspx对应的products.cs文件里,定义了当页面改变时要从数据库里取数据并填充给索引化列表productslist的datasource。

这样就得到了数据。

那么,怎么体现多层呢?哪里有层呢?层和层间如何发生关系呢?另文再述,也十分希望高人对此问题进行回复。

 

关于如何从数据库中取出数据动态显示到页面,上面只是探讨了其骨架,在customlist-productslist.ascx文件中,那个productslist用户控件,内藏了一些asp代码。右键点它,有编辑项模板 菜单选项,进入后可看到人工录入的<%# Eval("Image") %> src属性。问题是,这个函数是怎么得到值的? 

 
Windows 本地 PostgreSQL 忘记 postgres 密码后,如何重置密码并给 root 用户最高权限 <think>我们只需要根据内容生成摘要,不超过150字。摘要应该简明扼要概括主要问题和解决步骤。注意是中文摘要。</think>在Windows本地开发中,因root数据库账号无CREATEDB权限且忘记postgres超级管理员密码,通过临时修改pg_hba.conf为trust认证重置密码,并重启PostgreSQL服务进行登录,最后授予root用户SUPERUSER等权限,完成数据库创建。 阅读详情

相关推荐

RK3588开发笔记-spi扩展canfd芯片MCP2518FD调试笔记

在嵌入式系统开发中,CANFD(控制器局域网灵活数据速率)是一种广泛应用于汽车和工业自动化领域的通信协议。为了满足项目需求,我们在RK3588平台上通过SPI接口扩展了CANFD芯片MCP2518FD,之所以用spi进行canfd扩展,是为了解决原生RK3588原生can不够稳定的问题(发送扩展帧有几率编程标准帧,RK3568/3588均存在该问题)。通过本次调试工作,我们成功地在RK3588平台上扩展了CANFD芯片MCP2518FD,并实现了与CAN总线的稳定通信。

flypig has a dream! 4141

MTK的DM应用实例

一直想写一篇有关DM的文章,一直没有时间。DM是Draw Manager的简称。DM和History机制是MTK窗口设计的两大核心,掌握了DM和History,你就可以随心所欲的对MTK的各种控件如LIST,INPUT,status BAR,TITLE等任意任意组合,创建出符合自己需要的窗口。今天偶读一位网上朋友的文章,对其在DM上的功底十分佩服,借花献佛,共同学习。文章转自:http://b

懒人日志 2608

Custom_List

Custom_List

Custom List: 你去也逛逛

你去也逛逛java帮助文档java帮助文档JAVA中文网站sun公司java中文网站java帮助文档(未完成)sun公司翻译的帮助文档C/VC++学习C/VC++学习---论坛CSDN好好学习,天天向上LINUX源代码LINUX源代码学习网络协议学习网络协议(中文)...

云梦泽 176

Html List custom(自定义html列表)

Html custom list <dl> <dt>dt</dt> <dd>- dd</dd> <dd>- dd</dd> <dd>- dd</dd> <dt>dt</dt> <dd>- dd/dd> <dd>...

qq_37615581的博客 1277

Custom List: Custom List

&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;http&amp;#58;&amp;#47;&amp;#47;seasons.blogcn.com&lt;p&gt;&lt;p&gt;&amp;#25105;&amp;#30340;&amp;#26085;&amp;#24535;&amp;#30340;&amp;

seasons 172

Java开源在线考试系统怎么选?从技术选型到落地部署的完整指南

Java开源在线考试系统怎么选?本文从技术选型、核心功能、部署运维、二次开发等维度,梳理了Java开源在线考试系统的选型要点。

麦塔在线考试培训系统 343

数据库迁移不翻车:golang-migrate 实战,143 个 DDL 有序执行(第97篇-E83)

上一篇 讲了 Agent 怎么测试。但还有一个更基础的问题:数据库 schema 怎么变? 手动跑 SQL 总有人忘了加列、忘了写 down、忘了更新 CI。版本号撞车。dirty 状态没人管。DeepFlux 的答案是:golang-migrate + embed.FS + CI 链守卫 + 哨兵探针。这篇拆解 143 个迁移(000001~000143)是怎么做到不翻车的。

leeyisoft的专栏 190

cpp选手秋招学习笔记 day18

幂等是指一次或多次执行同一个操作,得到的业务结果是相同的,比如对于扣费,客户端因为网络问题重新发出请求,服务端不会进行多次处理,解决方法是可以客户端携带一个独特的唯一的id,然后服务端执行完之后存储这个id,之后新的请求到来比对id。主要是由cpu的内存管理逻辑维护,然后运行时动态的传递给CUDA的kernel,使用的时候传递这个block table,放置在GPU的显存。移动是指把资源的所有者权限转移,原有的变量有效但是状态不确定,赋值是拷贝复制对象,原对象不变。1.什么是幂等,如何保证。

m0_57222081的博客 265

商超智能运营如何落地?从系统架构到实战避坑的完整技术路径

3. **多端交互展示层**:需覆盖顾客使用的**小程序、APP及H5公众号**,以及员工使用的管理后台。答:在应用层引入**适配器模式**。在项目启动时,应强制要求供应商或自研团队产出**部署文档**(含环境变量清单)和**二次开发文档**(含核心流程时序图),确保后续维护不受限于个人。- **多租户插件**:MyBatis Plus的`TenantLineInnerInterceptor`可实现SQL层面的自动拼接`store_id`条件,防止开发者因SQL编写疏漏导致的数据越权。

weixin_56812938的博客 432

windows版本oracle19c安装教程-新手教程

windows版本oracle19c安装教程-新手教程、oracle19c新手教程 、oracle19c新手安装教程、oracle19c安装教程 windows版本

qq_27076243的博客 178

Oracle迁移到PostgreSQL数据库-FGOracle2PG工具

FGOracle2PG 是一款高性能、高可靠的 Oracle 数据库到 PostgreSQL 数据库迁移工具。它由风哥基于多年数据库运维与迁移实战经验开发。工具采用纯 Python 实现,支持命令行(CLI)与可视化 Web 控制台两种操作方式,能够覆盖从开发测试到生产环境的全场景数据库迁移需求。

风哥oracle/mysql/pg技术教程 184

基于Python的爱奇艺视频数据可视化分析系统

长视频平台剧集、评分、热度与评论数据体量大、维度多,手工汇总难以快速把握类型结构、口碑分布与主演导演影响力。系统采用 B/S 架构,后端入口为app.py,运行端口8060;数据库使用 MySQL(库名iqiyi),经 PyMySQL 访问。前台基于 Bootstrap 5、本地中的 ECharts 5 与 echarts-wordcloud,配合主题。业务表包括usersdramascommentsfavorites。数据可通过导入,或经/ 相关脚本补充样本。分析层在。

qq_35928134的博客 234

电商推返模式的技术架构与系统落地实践

成功的电商推返模式系统,本质是。

weixin_42804741的博客 188

Django的手机数据分析与可视化

Django的手机数据分析与可视化系统 摘 要 本系统基于Django框架、HTML和MySQL数据库技术,构建了一个全面的手机数据分析与可视化平台。大屏内容丰富,包括品牌市场份额分布、手机价格区间分布、各维度评分分布、热门机型Top10、内存容量分布以及品牌评分与价格分析等多个模块。通过这些模块,用户可以直观地了解手机市场的整体趋势、各品牌的市场表现、手机价格分布情况、用户评分分布以及热门机型的详细信息。系统采用了先进的可视化技术,将复杂的数据以图表的形式呈现,使得数据更加易于理解和分析。 在管理功能方

weixin_41915110的博客 771

MySQL 數據庫導入

2. 查詢sql語句模式。

MyFreeIT 12

FastAPI + SQLAlchemy 异步会话(AsyncSession)核心方法

result = await db.execute(select(News).where(...)) # 执行查询,返回 Result 对象。items = result.scalars().all() # 提取 Python 对象列表。await db.refresh(new_news) # 将生成的ID加载到本地对象。await db.commit() # 自动检测到对象变更,生成UPDATE发送。# ① 标记操作(内存中记录,未发SQL)

m0_52302665的博客 293

Agent状态管理与断点续传:Checkpointer机制深度解析

Checkpointer解决Agent长任务中断后重复执行前半程的痛点:只存游标、版本号、结果引用与幂等键,区别于长期记忆Store与追踪Trace。实现中断→存快照→校验→续跑闭环,靠幂等键兜住副作用。

sinat_28228747的博客 167

【基于GO的Web开发21】GORM 更新操作

并且执行模型钩子函数 (Hooks)。如果想跳过钩子,不自动维护。普通 Update / Updates / Save 都会自动更新。,不管字段是否修改,会把结构体所有字段全部更新到数据库。,直接把表达式交给数据库执行,不在 Go 代码做运算。,不会自动更新 UpdatedAt。在钩子函数内部修改数据库列,使用。时间,触发钩子 Hooks。,常用于密码加密等场景。

2503_92676540的博客 197

RocketMQ订单事务消息实战教学

用户下单要同时扣库存、扣余额、加积分,拆成 MQ 异步履约后,原子性、重复投递、部分成功三大难题怎么破?本文用一个真实可跑的下单案例,讲透 RocketMQ 事务消息(half 消息/本地事务/回查)、三层幂等防线(Redis SETNX + DB 唯一索引 + ▎ 条件更新)、业务失败与消费失败的区分处理、按状态补偿的 Saga 关单逆向流程,以及死信工单 + 人工重放的完整闭环。全量代码含 import、pom 依赖、建表 SQL,附三条可演示链路、生产落地清单与面试题速答,跟着做即可复现。

zhenyu333的博客 318

TCN-BiLSTM多变量单步时序预测MATLAB完整代码和数据

TCN-BiLSTM多变量单步时序预测MATLAB完整代码和数据从 Excel 文件读取时间序列数据,并构建带时间滞后的数据集;搭建 TCN 与 BiLSTM 结合的混合神经网络;对数据进行归一化处理,划分训练集与测试集;使用 Adam 优化器训练模型;进行单步预测,计算预测误差(MAE、RMSE、MAPE);可视化预测结果。平台:MATLAB2024b

上一篇: innerHTML与innerText用法
下一篇: C#索引器
redrainy
博客等级 码龄23年 22粉丝 67原创
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值