微信问题吧,就是我把我微信那个美女推给我朋友,女方会知道我把微信推广存在的问题给我朋友的吗?

个人总结(1)
说实话,觉着这个应该很容易来着,结果我耗费了一个小时多左右的时间
用户控件的注册总是有点迷迷糊糊的感觉,然后亲力亲为之后就觉着这个不过如此了。
用户控件注册有两种方式:
一:用@Register指令就行了。我觉着这个最简单了。
二:使用web.config配置文件就行了。
& & & & && &pages&
&controls&
&add tagPrefix=&uc& src=&~/UserControl/UserControl.ascx& tagName=&UserControl1&/&
&add &tagPrefix=&uc1& namespace=&Self_Validator&/&
&/controls&
& & & & 在使用配置文件的时候我觉着该是很简单的吧。
& & & 结果我却发现自己这么多的问题
& & & & &1.第一个add是添加自己的控件来着,我试过直接把namespace放里边,
& & & & & &&&pages&
&controls&
&add tagPrefix=&uc& src=&~/UserControl/UserControl.ascx& tagName=&UserControl1& namespace=&Self_Validator&//&
&/controls&
& & & & & & 变成这样子,结果老报错,通不过。
& & & & & & 事实证明,只有把namespace单独来add才行,还必须加tagPrefix这个前缀,我觉着这里的tagPrefix就相当于分组标志的感觉
& & & &2.如果我的src中的用户控件跟页面执行文件是处于同一级目录,编译也无法通过,还会报错。
& & & & & 至此我觉着真是坑爹啊。
& & & & & 然后再建个文件夹把我的用户控件放里边去,就通过了。
其次在自定义控件和用户控件上,曾经我倒是犯了一个错误,在注册的时候傻傻分不清楚这两个,其实这两个控件的注册很相似。
都是用的@Register指令或者配置文件来着,只是属性的问题。
自定义控件用@Register指令的时候根本不需要src这个属性,而用户控件就需要了。
而且自定义控件可以是个类,看书上说可以放在App_Code里边进行编译,不过这个方法我没怎么试过,因为我没找到这个文件夹,难不成是自己建的?
http://blog.csdn.net/zorsbutape/article/details/6327156这个博客很好的解决了我的疑问。感谢~~~~~~~~~
& & & & & & & & & & & & & & & & & & &&
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:10068次
排名:千里之外
原创:25篇
(5)(2)(8)(2)(1)(2)(1)(1)(9)(3)在ASP.NET 的早先版本里,开发人员通过在页面的顶部添加 指令来引入和使用自定义服务器控件和用户控件时,象这样:
&%@ Register TagPrefix="scott" TagName="header" Src="Controls/Header.ascx" %&&%@ Register TagPrefix="scott" TagName="footer" Src="Controls/Footer.ascx" %&&%@ Register TagPrefix="ControlVendor" Assembly="ControlVendor" %&&html&&body&&form id="form1" runat="server"&&scott:header ID="MyHeader" runat="server"/&form&body&html&
注意到上面的前两个注册指令是用来注册用户控件的(是在.ascx文件里实现的),最后这个是用来注册编译进一个程序集 .dll 文件里的自定义控件的。注册完后,开发人员可以在页面的任何地方用设定好的 tagprefix (标识前缀)和标识符号名( tagname)来声明这些控件。
这行之有效,但管理起来会很痛苦,当你要在你的网站的许多页面上使用控件的话,尤其是,假如你移动了.ascx 文件,需要更新所有的注册声明的话。
解决方案:
ASP.NET 2.0 使得控件声明极其干净而且管理起来极其容易。不用在你的页面上重复这些声明,只要在你的应用的web.config 文件的新的 pages-&controls 部分声明一次即可:
&?xml version="1.0"?&&configuration&&system.web&&pages&&controls&&add tagPrefix="scottgu" src="~/Controls/Header.ascx" tagName="header"/&&add tagPrefix="scottgu" src="~/Controls/Footer.ascx" tagName="footer"/&&add tagPrefix="ControlVendor" assembly="ControlVendorAssembly"/&controls&pages&system.web&configuration&
你可以用这种方式同时声明用户控件和编译好的自定义控件。当你使用这个技巧时,Visual Studio是完全支持这两者的,而且 VS 2005 Web Site 项目 和 VS 2005 Web Application 项目也都支持这两者。Visual Studio会在设计器里以所见即所得(WYSIWYG)模式显示这些控件,也会在后台编码文件里提示控件字段的声明。
需要注意的是,上面用户控件中“~”句法的使用。对那些不熟悉这个符号的人,ASP.NET中“~”符号意思是“从应用的根路径来定位”,它提供了一个很好的方法来避免在你的编码里到处使用“../”。在web.config文件里声明用户控件时,你总是应该使用它,因为页面也许会使用在不同子目录里的控件,所以你应该总是始终如一地从应用的根路径开始定位这些控件。
一旦你在web.config 文件中声明好这些控件后,你就可以在你网站上的任何一个页面,母板页或者用户控件中使用它们了,象这样(不再需要注册指令):
&html&&body&&form id="form1" runat="server"&&scottgu:header ID="MyHeader" runat="server"/&form&body&html&
希望本文对你有所帮助,
阅读(...) 评论()WEB用户控件
相关文档 共71134条,当前页显示
贡献者:| 下载:
文件:243.83KB
贡献者:| 下载:
文件:132.64KB
贡献者:| 下载:
文件:57.21KB
贡献者:| 下载:
文件:25.91KB
贡献者:| 下载:
文件:111.91KB
贡献者:| 下载:
文件:20.50KB
贡献者:| 下载:
文件:723.00KB
贡献者:| 下载:
文件:928.85KB
贡献者:| 下载:
文件:1.87MB
贡献者:| 下载:
文件:355.00KB
贡献者:| 下载:
文件:12.77MB
贡献者:| 下载:
文件:2.93MB
贡献者:| 下载:
文件:6.79MB
贡献者:| 下载:
文件:1.30MB
贡献者:| 下载:
文件:333.00KB
贡献者:| 下载:
文件:6.25MB
贡献者:| 下载:
文件:110.00KB
贡献者:| 下载:
文件:1.20MB
贡献者:| 下载:
文件:187.96KB
贡献者:| 下载:
文件:636.00KB
贡献者:| 下载:
文件:31.31KB
贡献者:| 下载:
文件:1.68MB
贡献者:| 下载:
文件:3.20MB
贡献者:| 下载:
文件:858.67KB
贡献者:| 下载:
文件:296.03KB
贡献者:| 下载:
文件:153.50KB
贡献者:| 下载:
文件:47.50KB
贡献者:| 下载:
文件:49.50KB
贡献者:| 下载:
文件:208.00KB
贡献者:| 下载:
文件:269.23KB
相关标签:
随心阅读:IT人的最佳阅读工具
诚邀优质文档资源者入驻
阅读/下载:40/0 | 16.54KB
阅读/下载:204/0 | 141.18KB
阅读/下载:363/0 | 1.10MB
阅读/下载:268/0 | 1.13MB
阅读/下载:14943/87 | 4.98MB
阅读/下载:42/0 | 2.29MB
阅读/下载:66/0 | 17.67MB
阅读/下载:74/0 | 1.02MB
阅读/下载:138/0 | 1.75MB
阅读/下载:370/3 | 243.83KB
阅读/下载:40/0 | 16.54KB
阅读/下载:204/0 | 141.18KB
阅读/下载:363/0 | 1.10MB
阅读/下载:268/0 | 1.13MB
阅读/下载:14943/87 | 4.98MB
阅读/下载:42/0 | 2.29MB
阅读/下载:66/0 | 17.67MB
阅读/下载:74/0 | 1.02MB
阅读/下载:138/0 | 1.75MB
阅读/下载:370/3 | 243.83KB下次自动登录
现在的位置:
& 综合 & 正文
另类的动态加载用户控件
最新更新:原本在看到此方案的时候觉的想到这方案的朋友特别高深,后来本人把本文写出来想和大家分享下,才知道这个就是Dottext方案中的一个模块而已.真是汗啊,嫌自己见识太浅。既然写了就当复习了一次Dottext.。这还是我第一次听说Dottext.
在BS架构这块,我们平时建一个网站,通常是创建一个WebSite网站,或者是创建一个WebApplication.然后在WEB项目里面建立相应的aspx文件,以及用户控件,自定义控件等等.但是做为一个新加入此项目的你要去修改里面的
某一个功能模板,那么我一般的是这样的:
第一:根据新的需求,在项目找到相关页面,例如对应的页面URL为index.aspx.此时可以对原页面做最初的了解.
第二:分析.
第三:根据新的需求来修改代码.
我想这也是一般朋友的思维模式吧.可是这样的流程并不是统一不变的,至于如何变化,我先想和园友们讨论一下如下的需求大家是如何实现的?
网站可能有多个版本,例如最起码的中英日版,各版本的内容呈现风格上也略有不同.
本人列举三个本人想到的做法:
第一种方法:每个版本单独建一个站点.具体要求具体实现.这种做法的缺点是维护困难,成本高.
第二种方法:建一个站点,为每个版本的同一个功能页面分别创建单独的页面.例如一个显示新闻的页面,分别为:中文新闻.aspx,英文新闻.aspx等.这种方法的缺点同上,只不过稍微会容易点.
第三种方法:建一个站点,一个功能就建一个页面,但为不同版本创建不同的用户控件,根据相应的参数为动态加载控件.这种做法是最优的.(个人认为)这做做法的缺点是程序的耦合度太强,如果是要增加一个版本,那么就要修改功能页面.
其实上面的第三种方法一般来说是可以解决问题的.后来在新的项目中发现了httpHandler的应用,可以自定义的捕捉到http请求.发现了一个全新的解决方案.
IHttpHandlerFactory在.net中算是用处比较多的。它能够在Hander对象生成前对当前页面的Hander进行预处理。一般我们如果是做URL重写的话,也会用到httphandler,现在可以利用它来实现我上面的需求.
网站呢,就建一个页面webform2.aspx.在这个页面中根据请求的URL来动态加载用户控件.而这个动态加载程序并不是写在webform2中的pageload事件中.而是写的页面的AddParsedSubObject事件中.当用户访问别外一个页面,例如一个搜索页search.aspx,此时站中并不实际存在这个页面.而是利用httphandler来捕获这个HTTP请求,定向于已经实际存在的webform2.aspx页面,在webform2.aspx页面中的AddParsedSubObject事件中完成搜索控件的加载.
第一:如何来自定义的来捕获HTTP请求呢?
1:建立一个实现了接口IHttpHandlerFactory的类.
IHttpHandlerFactory 类型公开了以下成员。
GetHandler
返回实现 IHttpHandler 接口的类的实例。
ReleaseHandler
使工厂可以重用现有的处理程序实例。
Codepublic class WebPageHandlerFactory : IHttpHandlerFactory
public virtual IHttpHandler GetHandler(HttpContext context, string requestType, string url, string path)
if (IsExistedPage(path))
return PageParser.GetCompiledPageInstance(url, path, context);
if (!path.ToLower().EndsWith(".aspx"))
path = bine(path, "webform2.aspx");
url = ReplaceUrl(url);
path = ReplaceUrl(path);
return PageParser.GetCompiledPageInstance(url, path, context);
/**//// &summary&
/// 判断当前请求的URL是否真实存在
/// &/summary&
/// &param name="path"&请求URL的相对路径&/param&
/// &returns&&/returns&
private bool IsExistedPage(string path)
//首页是已经存在的
if (path.ToLower().IndexOf("webform2.aspx") & <span style="color: #)
return true;
return false;
/**//// &summary&
/// 把实际不存在的页面名称转换成已经真实存在的default.aspx
/// 例如:default2.aspx实际不存在,则把default2.aspx转换成default.aspx
/// &/summary&
/// &param name="input"&当前请求的但实际并不存在的URL 例如:default2.aspx&/param&
/// &returns&&/returns&
private string ReplaceUrl(string input)
// Regex search and replace
RegexOptions options = RegexOptions.N
Regex regex = new Regex(@"\w+.aspx", options);
string replacement = @"webform2.aspx";
string result = regex.Replace(input, replacement);
public virtual void ReleaseHandler(IHttpHandler handler)
2:配置WEB.CONFIG
&httpHandlers&
&add verb="*" path="/*.aspx" type="WebApplication_Test.WebPageHandlerFactory, WebApplication_Test"/&
&/httpHandlers&
参数简单说明:
path:要捕获的文件路径.
type:WebApplication_Test.WebPageHandlerFactory :实现了接口IHttpHandlerFactory的类
WebApplication_Test:WEB站的命名空间
这样就可以捕获HTTP请求了,例如请求index2.aspx,站点中并不存在,但是当你访问时程序并不会报错,而是会实际转向到webform2.aspx.此时用户看到的还是index2.aspx.
第二:如何实现根据URL来动态加载用户控件呢?并不是在页面用if条件判断.这里我们要提一下HtmlContainerControl.
HtmlContainerControl:
用作映射到需要具有开始标记和结束标记的 HTML 元素的 HTML 服务器控件的抽象基类。
我们通常在一个页面动态加载控件,都是在页面中放一个pannel,此pannel一般放在form中,这样用户控件中的服务器控件就可以正常运行了.然后把要加载的控件加入到pannel中即可.为此我们可以自定义一个继承HtmlContainerControl的服务器控件来充当pannel容器.
总的实现过程如下:
1:建立的容器页:WebForm2.aspx,站点中只存在这一个页面,其它的页面请求都是通过它运行的.
&%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs"
Inherits="WebApplication_Test.WebForm2" %&
&%@ Register TagPrefix="ccWebUI" Namespace="Common.UI" Assembly="Common.UI"
&ccWebUI:masterpagecontrol id="MPContainer" runat="server"&&/ccWebUI:masterpagecontrol&
页面cs代码
//装入模板
Codepublic partial class WebForm2 : BasePage
protected void Page_Load(object sender, EventArgs e)
//装入模板
protected override void AddParsedSubObject(object obj)
AppSettingPage config = new AppSettingPage(Context);
base.AddParsedSubObject(obj);
if (obj is
MasterPageControl)
string TemplateFilePath = config.TeamplateFileP
if (!string.IsNullOrEmpty(TemplateFilePath))
((MasterPageControl)obj).Controls.Clear();
((MasterPageControl)obj).TemplateFile = config.TeamplateFileP
AddParsedSubObject:
通知服务器控件某个元素(XML 或 HTML)已经过语法分析,并将该元素添加到服务器控件的 ControlCollection 对象。通过这个事件可以对页面的所有控件进行分析并能够进一步操作页面加载过程,例如本文提出的根据URL来动态加载用户控件.
AppSettingPage:页面配置文件,它实现了根据用户请求的URL来指定应该加载哪一个控件.
Codepublic class AppSettingPage
//页面访问的URL
public string U
//模板页面加载控件的路径
public string TeamplateFileP
public AppSettingPage(string url)
this.Url = url.ToLower();
AnalysisUrl(this.Url);
public AppSettingPage(HttpContext context)
string url = context.Request.Url.ToString();
this.Url = url.ToLower();
AnalysisUrl(this.Url);
/**//// &summary&
/// 根据当前请求的URL来取相应控件的路径
/// &/summary&
/// &param name="url"&当前请求的URL&/param&
public void AnalysisUrl(string url)
//读取模板信息,取出所有控件路径列表
PageInfo[] pages = TemplateConfig.Pages();
foreach (PageInfo page in pages)
if (Regex.IsMatch(url, page.pattern, RegexOptions.IgnoreCase))
//如果当前请求的URL在配置文件中则取相应控件的路径
this.TeamplateFilePath = page.target_
类:TemplateConfig.cs 它根据URL来与TemplateConfig.xml相匹配,返回要加载控件的路径,这样做就可以实现加载控件与页面逻辑的解耦了,只要在配置文件中配置好URL与控件路径的对应关系就行。
Code /**//// &summary&
/// XmlScheme 的摘要说明。
/// &/summary&
public struct PageInfo
//页面名称
public string
//控件路径
public string target_
[System.Serializable]
public class TemplateConfig
public TemplateConfig() { }
public static XmlDocument doc = null;
public static PageInfo[] Pages()
doc = new XmlDocument();
//加载模板文档
doc.Load(HttpContext.Current.Request.MapPath("TemplateConfig.xml"));
if (doc == null)
return null;
DataTable _dr = XmlDataTable(doc, "pages/page");
if (_dr.Rows .Count &<span style="color: #) return null;
//模板个数
int iTemplateCount = _dr.Rows .C
PageInfo[] info = new PageInfo[iTemplateCount];
for (int i = <span style="color: #; i & iTemplateC i++)
<img alt="" src="/Images/dot.gif"
&&&&推荐文章:
【上篇】【下篇】}

我要回帖

更多关于 微信扫码下载apk问题 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信