ASP.NET的隐藏功能

时间:2008-09-10 18:20:48

标签: asp.net .net

  

这个问题的存在是因为它有   历史意义,但事实并非如此   被认为是一个很好的主题问题   对于本网站,所以请不要使用它   作为你可以问类似的证据    这里有问题。

     

更多信息:https://stackoverflow.com/faq


总有一些功能在边缘场景中很有用,但正是由于这个原因,大多数人都不了解它们。我要求提供教科书通常不会教授的功能。

你知道的是什么?

53 个答案:

答案 0 :(得分:335)

测试时,您可以将电子邮件发送到计算机上的文件夹而不是SMTP服务器。把它放在你的web.config中:

<system.net>
    <mailSettings>
        <smtp deliveryMethod="SpecifiedPickupDirectory">
            <specifiedPickupDirectory pickupDirectoryLocation="c:\Temp\" />
        </smtp>
    </mailSettings>
</system.net>

答案 1 :(得分:210)

如果您放置名为 app_offline.htm 的文件 在Web应用程序目录的根目录中,ASP.NET 2.0+将关闭应用程序并停止正常处理该应用程序的任何新传入请求,仅显示所有新请求的app_offline.htm文件的内容< / em>的

这是在将更改重新部署(或回滚)到生产服务器时显示“暂时不可用站点”通知的最快捷,最简单的方法。

另外,正如marxidad所指出的,请确保文件中至少有512个字节的内容,以便IE6正确呈现它。

答案 2 :(得分:119)

throw new HttpException(404, "Article not found");

这将被ASP.NET捕获,它将返回customErrors页面。在recent .NET Tip of the Day Post

中了解到这一点

答案 3 :(得分:75)

这是最好的一个。将其添加到您的web.config中,以便更快地进行编译。这是通过this QFE发布的3.5SP1。

<compilation optimizeCompilations="true">
  

快速摘要:我们正在介绍一个   新的optimizeCompilations开关   ASP.NET可以大大提高   某些情况下的编译速度。   有一些捕获,所以请继续阅读   更多细节。这个开关是   目前可作为QFE使用   3.5SP1,将成为VS 2010的一部分。

     

ASP.NET编译系统需要一个   非常保守的做法   导致它消灭任何以前的   它曾经做过的工作'顶级   级别'文件更改。 '顶级'文件   包含bin和App_Code中的任何内容,   以及global.asax。虽然这个   它适用于小型应用程序   几乎无法用于非常大的应用程序。   例如。一个客户遇到了   需要10分钟的情况   进行任何更改后刷新页面   到'bin'组装。

     

为了缓解疼痛,我们添加了一个   '优化'编译模式   不那么保守   重新编译的方法。

通过here

答案 4 :(得分:73)

  • HttpContext.Current 将始终允许您访问当前上下文的请求/响应/等,即使您无法访问Page的属性(例如,来自松散的-coupled helper class)。

  • 您可以通过调用 Response.Redirect( url false )将用户重定向到另一个页面后继续在同一页面上执行代码/强>

  • 如果你想要的只是一个编译好的页面(或任何 IHttpHandler ),你就不需要 .ASPX 文件。只需将路径和HTTP方法设置为指向web.config文件中<httpHandlers> element中的类。

  • 可以通过调用 PageParser.GetCompiledPageInstance(virtualPath,aspxFileName,Context)以编程方式从 .ASPX 文件中检索 Page 对象

答案 5 :(得分:70)

machine.config级别的零售模式:

<configuration>
  <system.web>
    <deployment retail="true"/>
  </system.web>
</configuration>

覆盖web.config设置以将调试强制为false,打开自定义错误并禁用跟踪。不再忘记在发布之前更改属性 - 只需将它们全部配置为开发或测试环境并更新生产零售设置。

答案 6 :(得分:59)

在内容页面中启用 intellisense for MasterPages 我确信这是一个鲜为人知的黑客

大多数情况下,当你想使用它时,你必须使用findcontrol方法并从内容页面中转换主页面中的控件, MasterType 指令将在visual studio中启用intellisense到这个

只需向页面添加一个指令

<%@ MasterType VirtualPath="~/Masters/MyMainMasterPage.master" %>

如果您不想使用虚拟路径并使用类名,那么

<%@ MasterType TypeName="MyMainMasterPage" %>

获取完整文章here

答案 7 :(得分:58)

HttpContext.Items作为请求级缓存工具

答案 8 :(得分:52)

我脑子里突出了两件事:

1)您可以从代码中打开和关闭Trace:

#ifdef DEBUG 
   if (Context.Request.QueryString["DoTrace"] == "true")
                {
                    Trace.IsEnabled = true;
                    Trace.Write("Application:TraceStarted");
                }
#endif

2)您只需使用一个共享的“代码隐藏”文件即可构建多个.aspx页面。

构建一个类.cs文件:

public class Class1:System.Web.UI.Page
    {
        public TextBox tbLogin;

        protected void Page_Load(object sender, EventArgs e)
        {

          if (tbLogin!=null)
            tbLogin.Text = "Hello World";
        }
    }

然后您可以拥有任意数量的.aspx页面(在您删除VS生成的.designer.cs和.cs代码隐藏之后):

  <%@ Page Language="C#"  AutoEventWireup="true"  Inherits="Namespace.Class1" %>
     <form id="form1" runat="server">
     <div>
     <asp:TextBox  ID="tbLogin" runat="server"></asp: TextBox  >
     </div>
     </form>

您可以在ASPX中拥有未出现在Class1中的控件,反之亦然,但您需要记住检查控件是否为空。

答案 9 :(得分:48)

您可以使用:

 Request.Params[Control.UniqueId] 

要在初始化viewstate之前获取控件的值(此时Control.Text等将为空)。

这对于Init。

中的代码很有用

答案 10 :(得分:46)

<强>的WebMethods。

您可以将ASP.NET AJAX回调用于放置在ASPX页面中的Web方法。您可以使用[WebMethod()]和[ScriptMethod()]属性修饰静态方法。例如:

[System.Web.Services.WebMethod()] 
[System.Web.Script.Services.ScriptMethod()] 
public static List<string> GetFruitBeginingWith(string letter)
{
    List<string> products = new List<string>() 
    { 
        "Apple", "Banana", "Blackberry", "Blueberries", "Orange", "Mango", "Melon", "Peach"
    };

    return products.Where(p => p.StartsWith(letter)).ToList();
}

现在,在ASPX页面中,您可以执行以下操作:

<form id="form1" runat="server">
    <div>
        <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true" />
        <input type="button" value="Get Fruit" onclick="GetFruit('B')" />
    </div>
</form>

使用以下方法通过JavaScript调用服务器端方法:

    <script type="text/javascript">
    function GetFruit(l)
    {
        PageMethods.GetFruitBeginingWith(l, OnGetFruitComplete);
    }

    function OnGetFruitComplete(result)
    {
        alert("You got fruit: " + result);
    }
</script>

答案 11 :(得分:45)

在开始长时间运行的任务之前,检查客户端是否仍然连接:

if (this.Response.IsClientConnected)
{
  // long-running task
}

答案 12 :(得分:44)

ASP.NET的一个鲜为人知且很少使用的功能是:

Tag Mapping

它很少被使用,因为只有你需要它的特定情况,但是当你需要它时,所以很方便。

关于这个鲜为人知的特征的一些文章:

Tag Mapping in ASP.NET
Using Tag Mapping in ASP.NET 2.0

以及上一篇文章:

  

标签映射允许您交换   编译时的兼容控件   Web应用程序中的每个页面。一个   有用的例子是你有股票   ASP.NET控件,如   DropDownList,你想要替换   它具有自定义控件   派生自DropDownList。这可以   是一个定制的控件   提供更优化的缓存   查找数据。而不是编辑每一个   Web表单并替换内置的   DropDownLists与您的自定义   版本,您可以拥有ASP.NET   效果通过修改为你做   web.config中:

<pages>
 <tagMapping>
   <clear />
   <add tagType="System.Web.UI.WebControls.DropDownList"
        mappedTagType="SmartDropDown"/>
  </tagMapping>
</pages>

答案 13 :(得分:43)

HttpModules。这座建筑非常优雅。也许不是一个隐藏的功能,但也很酷。

答案 14 :(得分:34)

代码表达式生成器

示例标记:

Text = '<%$ Code: GetText() %>'
Text = '<%$ Code: MyStaticClass.MyStaticProperty %>'
Text = '<%$ Code: DateTime.Now.ToShortDateString() %>'
MaxLenth = '<%$ Code: 30 + 40 %>'

代码表达式构建器的真正之处在于,您可以在非数据绑定情况下使用数据绑定表达式。您还可以创建执行其他功能的其他Expression Builders。

的web.config:

<system.web>    
    <compilation debug="true">
        <expressionBuilders>
            <add expressionPrefix="Code" type="CodeExpressionBuilder" />

使这一切成为现实的cs类:

[ExpressionPrefix("Code")]
public class CodeExpressionBuilder : ExpressionBuilder
{
    public override CodeExpression GetCodeExpression(
        BoundPropertyEntry entry,
        object parsedData,
        ExpressionBuilderContext context)
    {            
        return new CodeSnippetExpression(entry.Expression);
    }
} 

答案 15 :(得分:34)

您可以在.aspx页面中使用ASP.NET注释来注释掉包含服务器控件的页面的完整部分。注释掉的内容永远不会发送给客户。

<%--
    <div>
        <asp:Button runat="server" id="btnOne"/>
    </div>
--%>

答案 16 :(得分:33)

ASHX文件类型的用法:
如果你想在不经过页面事件处理程序的情况下输出一些基本的html或xml,那么你可以用一种简单的方式实现HttpModule

将页面命名为SomeHandlerPage.ashx并将下面的代码(仅一行)放入其中

<%@ webhandler language="C#" class="MyNamespace.MyHandler" %>

然后是代码文件

using System;
using System.IO;
using System.Web;

namespace MyNamespace
{
    public class MyHandler: IHttpHandler
    {
        public void ProcessRequest (HttpContext context)
        {   
            context.Response.ContentType = "text/xml";
            string myString = SomeLibrary.SomeClass.SomeMethod();
            context.Response.Write(myString);
        }

        public bool IsReusable
        {
            get { return true; }
        }
    }
}

答案 17 :(得分:27)

Setting Server Control Properties Based on Target Browsermore

<asp:Label runat="server" ID="labelText" 
    ie:Text="This is IE text" 
    mozilla:Text="This is Firefox text" 
    Text="This is general text" 
/>

有点让我感到意外。

答案 18 :(得分:26)

我参与了一个asp.net应用程序,该应用程序经过了一家领先的安全公司的安全审核,我学会了这个简单的技巧来防止一个鲜为人知但却很重要的安全漏洞。

以下说明来自: http://www.guidanceshare.com/wiki/ASP.NET_2.0_Security_Guidelines_-_Parameter_Manipulation#Consider_Using_Page.ViewStateUserKey_to_Counter_One-Click_Attacks

考虑使用Page.ViewStateUserKey来对抗一键攻击。如果您验证调用者并使用ViewState,请在Page_Init事件处理程序中设置Page.ViewStateUserKey属性以防止一键攻击。

void Page_Init (object sender, EventArgs e) {
  ViewStateUserKey = Session.SessionID;
}

将属性设置为您知道每个用户唯一的值,例如会话ID,用户名或用户标识符。

当攻击者创建一个网页(.htm或.aspx)时,会发生一键攻击,该网页包含一个名为__VIEWSTATE且已填充ViewState数据的隐藏表单字段。可以从攻击者先前创建的页面生成ViewState,例如包含100个项目的购物车页面。攻击者诱使不知情的用户浏览该页面,然后攻击者将该页面发送到ViewState有效的服务器。服务器无法知道ViewState源自攻击者。 ViewState验证和HMAC不会对抗此攻击,因为ViewState有效且页面在用户的安全上下文下执行。

通过设置ViewStateUserKey属性,当攻击者浏览页面以创建ViewState时,该属性将初始化为他或她的名字。当合法用户将页面提交给服务器时,它将使用攻击者的名称进行初始化。因此,ViewState HMAC检查失败并生成异常。

答案 19 :(得分:26)

答案 20 :(得分:25)

HttpContext.Current.IsDebuggingEnabled

这非常适合确定要输出哪些脚本(最小版本或完整版本)或您在开发中可能需要的任何其他内容,但不能直播。

答案 21 :(得分:20)

Panels中的

DefaultButton属性。

它为特定面板设置默认按钮。

答案 22 :(得分:20)

包含在ASP.NET 3.5 SP1中:

  • customErrors现在支持“redirectMode”属性,其值为“ResponseRewrite”。显示错误页面而不更改URL。
  • 表单标记现在可识别操作属性。非常适合使用URL重写

答案 23 :(得分:19)

使用configSource拆分配置文件。

您可以使用web.config文件中的configSource属性将配置元素推送到其他.config文件,例如, 而不是:

    <appSettings>
        <add key="webServiceURL" value="https://some/ws.url" />
        <!-- some more keys -->
    </appSettings>

...您可以将整个appSettings部分存储在另一个配置文件中。这是新的web.config

    <appSettings configSource="myAppSettings.config" />

myAppSettings.config文件:

    <appSettings>        
        <add key="webServiceURL" value="https://some/ws.url" />
        <!-- some more keys -->
    </appSettings>

这对于将应用程序部署到客户并且不希望它们干扰web.config文件本身并且只是希望它们能够仅更改一些设置的情况非常有用。

参考:http://weblogs.asp.net/fmarguerie/archive/2007/04/26/using-configsource-to-split-configuration-files.aspx

答案 24 :(得分:19)

答案 25 :(得分:17)

Page指令中的

MaintainScrollPositionOnPostback属性。它用于在回发中保持aspx页面的滚动位置。

答案 26 :(得分:16)

HttpContext.IsCustomErrorEnabled是一个很酷的功能。我发现它不止一次有用。这是关于它的short post

答案 27 :(得分:16)

默认情况下,自定义控件的标记之间的任何内容都会添加为子控件。这可以在 AddParsedSubObject()覆盖中截获,以进行过滤或其他解析(例如,LiteralControls中的文本内容):

    protected override void AddParsedSubObject(object obj)
     { var literal = obj as LiteralControl;
       if (literal != null) Controls.Add(parseControl(literal.Text));
       else base.AddParsedSubObject(obj);
     }

...

   <uc:MyControl runat='server'>
     ...this text is parsed as a LiteralControl...
  </uc:MyControl>

答案 28 :(得分:13)

如果您有ASP.NET生成RSS源,它有时会在页面顶部添加一行。这不会使用常见的RSS验证器进行验证。您可以通过将页面指令<@Page>放在页面底部来解决此问题。

答案 29 :(得分:12)

我的团队经常使用它作为黑客:

WebRequest myRequest = WebRequest.Create("http://www.google.com");
WebResponse myResponse = myRequest.GetResponse();
StreamReader sr = new StreamReader(myResponse.GetResponseStream());

// here's page's response loaded into a string for further use

String thisReturn = sr.ReadToEnd().Trim();

它将网页的响应加载为字符串。您也可以发送帖子参数。

当我们需要便宜又快速的东西时,我们在ASCX / AJAX / WebServices的位置使用它。基本上,它是跨服务器访问Web可用内容的快捷方式。事实上,我们昨天刚刚将其称为“Redneck Web Service”。

答案 30 :(得分:12)

在ASP.NET v3.5添加路由之前,您可以通过编写HTTPModule并在页面管道的早期重写请求(如BeginRequest事件)来创建自己的友好URL。

http://servername/page/Param1/SomeParams1/Param2/SomeParams2这样的网址会映射到下面的其他网页(通常使用正则表达式)。

HttpContext.RewritePath("PageHandler.aspx?Param1=SomeParms1&Param2=SomeParams2");

DotNetNuke有一个非常好的HttpModule,可以为他们友好的网址做到这一点。对于无法部署.NET v3.5的计算机仍然有用。

答案 31 :(得分:11)

您是否知道可以在IIS或Visual Studio之外运行ASP.Net?

整个运行时打包并准备好在任何想要尝试的过程中托管。使用ApplicationHostHttpRuntimeHttpApplication类,您也可以查看这些.aspx页面并从中获取闪亮的HTML输出。

HostingClass host = ApplicationHost.CreateApplicationHost(typeof(HostingClass), 
                                            "/virtualpath", "physicalPath");
host.ProcessPage(urlToAspxFile); 

您的托管课程:

public class HostingClass : MarshalByRefObject
{
    public void ProcessPage(string url)
    {
        using (StreamWriter sw = new StreamWriter("C:\temp.html"))
        {
            SimpleWorkerRequest worker = new SimpleWorkerRequest(url, null, sw);
            HttpRuntime.ProcessRequest(worker);
        }
                    // Ta-dah!  C:\temp.html has some html for you.
    }
}

答案 32 :(得分:10)

CompilationMode="Never"是一个在某些ASP.NET站点中至关重要的功能。

如果您有一个ASP.NET应用程序,其中ASPX页面经常通过CMS或其他发布系统生成和更新,则使用CompilationMode =“Never”非常重要。

如果没有此设置,ASPX文件更改将触发重新编译,这将很快使您的应用程序域重新启动。这可以消除会话状态和httpruntime缓存,更不用说重新编译引起的延迟了。

(为了防止重新编译,可以增加numRecompilesBeforeAppRestart设置,但这并不理想,因为它会消耗更多内存。)

此功能的一个警告是ASPX页面不能包含任何代码块。为了解决这个问题,可以将代码放在自定义控件和/或基类中。

在ASPX页面不经常更改的情况下,此功能大多无关紧要。

答案 33 :(得分:9)

我想到了一个功能,有时您需要隐藏页面的某些部分。您可以使用 javascript 或使用以下简单代码执行此操作:

if (Request.Browser.Crawler){
        HideArticleComments();

答案 34 :(得分:9)

答案 35 :(得分:9)

VS chokes on的有效语法:

<input type="checkbox" name="roles" value='<%# Eval("Name") %>' 
  <%# ((bool) Eval("InRole")) ? "checked" : "" %> 
  <%# ViewData.Model.IsInRole("Admin") ? "" : "disabled" %> />

答案 36 :(得分:8)

与optimizeCompilations =“true”解决方案类似,此处另一个解决方案是加快您在构建之间等待的时间(非常好,特别是如果您正在处理大型项目):创建基于ram的驱动器(即使用RamDisk)并将默认的“Temporary ASP.NET Files”更改为此基于内存的驱动器。

有关如何执行此操作的完整详细信息,请访问我的博客:http://www.wagnerdanda.me/2009/11/speeding-up-build-times-in-asp-net-with-ramdisk/

基本上你首先配置一个RamDisk(再次,在我的博客中有一个指向免费ramdisk的链接),然后根据这个改变你的web.config:

 <system.web>
 ....
     <compilation debug="true" tempDirectory="R:\ASP_NET_TempFiles\">
     ....
     </compilation>
 ....
 </system.web>

它大大增加了我的开发时间,你只需要为你的计算机投入内存:)

快乐编程!

Wagner Danda

答案 37 :(得分:7)

<强> Request.IsLocal Property :

它指示当前请求是否来自本地计算机。

if( Request.IsLocal )
{
   LoadLocalAdminMailSettings();
}
else
{
   LoadServerAdminMailSettings();
}

答案 38 :(得分:7)

当我将xmlDocument()转储到标签中并使用它的xsl转换显示时,我觉得它很整洁。

答案 39 :(得分:6)

EnsureChildControls Method:它会检查子控件是否已启动。如果未启动子控件,则调用CreateChildControls方法。

答案 40 :(得分:6)

默认情况下,任何网络表单页面都继承自System.Web.UI.Page类。如果您希望页面从继承自System.Web.UI.Page的自定义基类继承,该怎么办?

有一种方法可以限制任何页面继承自己的基类。只需在web.config上添加一个新行:

<system.web>
    <pages pageBaseType="MyBasePageClass" />
</system.web>

注意:这仅在您的课程是独立课程时有效。我的意思是没有代码隐藏的类,看起来像<%@ Page Language="C#" AutoEventWireup="true" %>

答案 41 :(得分:5)

将位于App_Code文件夹中的类附加到全局应用程序类文件。

ASP.NET 2.0 - Global.asax - Code Behind file

这也适用于Visual Studio 2008。

答案 42 :(得分:4)

很多人都提到了重新编译时如何优化代码。最近我发现我可以在aspx页面中完成大部分开发(代码隐藏的东西)并完全跳过构建步骤。只需保存文件并刷新页面即可。您所要做的就是将代码包装在以下标记中:

<script runat="server">

   Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
     Response.Write("Look Ma', I didn't even had to build!")
   End Sub

</script>

完成后,只需将所有内容移至代码隐藏,构建,测试一切正常,瞧!

-D

答案 43 :(得分:4)

您可以使用UniqueID属性找到任何控件:

Label label = (Label)Page.FindControl("UserControl1$Label1");

答案 44 :(得分:2)

Page对象上的

ClientScript属性。

答案 45 :(得分:2)

web.config中appsettings元素的

'file'属性。

指定包含自定义应用程序配置设置的外部文件的相对路径。

如果您在很多需要在不同环境(prod)上修改的应用程序设置很少,这是一个很好的选择。

由于对Web.config文件的任何更改都会导致应用程序重新启动,因此使用单独的文件允许用户修改appSettings部分中的值,而不会导致应用程序重新启动。单独文件的内容与Web.config文件中的appSettings部分合并。

答案 46 :(得分:2)

如果您使用Web服务而不是WCF服务,您仍然可以使用标准.Net成员身份来强制执行身份验证和登录会话行为 在一个集合的Web服务上,类似于如何使用成员身份验证和安全保护网站。无需特别会议 和/或soap标头实现,只需调用System.Web.Security.FormsAuthentication.SetAuthCookie(userName,false)[调用后] Membership.ValidateUser(userName,password)当然]在响应中创建cookie,就好像用户已通过Web表单登录一样。 然后,您可以使用Response.Cookies []。Value检索此身份验证cookie,并将其作为字符串返回给用户 通过解压缩在Application_BeginRequest中重新创建cookie,可以用于在后续调用中验证用户身份 cookie方法调用来自Request.InputStream的param,并在成员身份验证请求之前重新创建auth cookie,这样 成员资格提供程序被欺骗,并将知道该请求已通过身份验证并强制执行其所有规则。

将此cookie返回给用户的示例Web方法签名将是: string登录(userName,密码)

示例后续Web方法调用将是: 字符串DoSomething(字符串authcookie,字符串methodParam1,int methodParam2等),你需要从Request.InputStreamis中提取authcookie(这是从Login方法获得的值)参数

这也模拟了一个登录会话,并在像这个Logout(authcookie)这样的Web方法中调用FormsAuthentication.SignOut 让用户需要再次登录。

答案 47 :(得分:1)

应用程序变量可与Web应用程序一起用于跨整个应用程序进行通信。它在Global.asax文件中初始化,并由所有用户独立于他们创建的会话在该Web应用程序的页面上使用。

答案 48 :(得分:0)

可以将ASPX页面打包到库(.dll)中,并使用ASP.NET引擎为它们提供服务。

您需要实现自己的VirtualPathProvider,它将通过Relfection特定的DLL加载,或者您可以在路径名中包含DLL名称。这取决于你。

当覆盖VirtualFile.Open方法时,会发生神奇的事情,您将ASPX文件作为资源从Assembly类返回:Assembly.GetManifestResourceStream。 ASP.NET引擎将处理资源,因为它是通过VirtualPathProvider提供的。

这允许插件页面,或者像我一样,使用它来包含带控件的HttpHandler。

答案 49 :(得分:0)

Templated user controls。一旦你知道它们是如何工作的,你就会看到各种各样的可能性。这是最简单的实现:

<强> TemplatedControl.ascx

这里最棒的是使用简单且熟悉的用户控件构建块,并能够使用HTML和一些占位符来布局UI的不同部分。

<%@ Control Language="C#" CodeFile="TemplatedControl.ascx.cs" Inherits="TemplatedControl" %>

<div class="header">
    <asp:PlaceHolder ID="HeaderPlaceHolder" runat="server" />
</div>
<div class="body">
    <asp:PlaceHolder ID="BodyPlaceHolder" runat="server" />
</div>

<强> TemplatedControl.ascx.cs

此处的“秘密”是使用ITemplate类型的公共属性,并了解[ParseChildren][PersistenceMode]属性。

using System.Web.UI;

[ParseChildren(true)]
public partial class TemplatedControl : System.Web.UI.UserControl
{
    [PersistenceMode(PersistenceMode.InnerProperty)]
    public ITemplate Header { get; set; }

    [PersistenceMode(PersistenceMode.InnerProperty)]
    public ITemplate Body { get; set; }

    void Page_Init()
    {
        if (Header != null)
            Header.InstantiateIn(HeaderPlaceHolder);

        if (Body != null)
            Body.InstantiateIn(BodyPlaceHolder);
    }
}

<强> Default.aspx的

<%@ Register TagPrefix="uc" TagName="TemplatedControl" Src="TemplatedControl.ascx" %>

<uc:TemplatedControl runat="server">
    <Header>Lorem ipsum</Header>
    <Body>
        // You can add literal text, HTML and server controls to the templates
        <p>Hello <asp:Label runat="server" Text="world" />!</p>
    </Body>
</uc:TemplatedControl>

您甚至可以获得内部模板属性的IntelliSense。因此,如果您在团队中工作,您可以快速创建可重用的UI,以实现您的团队已经从内置的ASP.NET服务器控件中享受的相同可组合性。

MSDN example(与开头相同的链接)添加了一些额外的控件和命名容器,但只有在您想要支持“repeater-type”控件时才需要。

答案 50 :(得分:-3)

我使用的一个与VB,VBScript和VB.NET的多个版本一起工作的东西是将记录集值转换为字符串以消除NULL或空白的多重测试。即Trim(rsData("FieldName").Value & " ")
在整数值的情况下,这将是:CLng("0" & Trim(rsData("FieldName").Value & " "))

答案 51 :(得分:-6)

网站发布并部署在生产服务器后,如果我们需要在服务器端按钮点击事件做一些更改。我们可以使用aspx页面本身中的new关键字覆盖现有的click事件。

实施例

方法背后的代码

 Protected void button_click(sender object, e System.EventArgs) 
  {
     Response.Write("Look Ma', I Am code behind code!")  
  }

OverRided Method:

<script runat="server">   
   Protected void new button_click(sender object, e System.EventArgs) 
  {
     Response.Write("Look Ma', I am overrided method!")  
  }

</script

通过这种方式,我们可以轻松修复生产服务器错误而无需重新部署。

答案 52 :(得分:-6)

这似乎是一个巨大而模糊的问题...... 但是我会抛出反思,因为它允许我做一些非常强大的东西,比如可插拔的DAL等。