mvc - asp.net core教程



ASP.NET的隐藏特性 (20)

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; }
        }
    }
}

https://src-bin.com

这个问题的存在是因为它具有历史意义,但它不被认为是本网站的一个好题目, 因此请不要将其作为证据表明您可以在此提出类似的问题。

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

在边缘情况下总是会有用的特征,但正因为如此,大多数人都不了解它们。 我所要求的功能通常不是教科书所教的。

你知道什么?


Answer #1

HttpContext.IsCustomErrorEnabled是一个很酷的功能。我发现它不止一次有用。 这是一篇关于它的简短文章



Answer #3

machine.config级别的零售模式:

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

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


Answer #4

HttpContext.Current.IsDebuggingEnabled

这对于确定要输出哪些脚本(最小或完整版本)或其他任何您可能想要在开发中但非活着的情况非常有用。




Answer #7

代码表达式生成器

样本标记:

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

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

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);
    }
} 

Answer #8

的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>

Answer #9

一个鲜为人知并且很少使用的ASP.NET特性是:

标签映射

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

一些关于这个小知识的文章:

ASP.NET中的标记映射
在ASP.NET 2.0中使用标记映射

并从最后一篇文章:

标记映射允许您在编译时在Web应用程序的每个页面上交换兼容的控件。 一个有用的例子是,如果您有一个股票ASP.NET控件,如DropDownList,并且您想用从DropDownList派生的自定义控件替换它。 这可能是一个自定义的控件,用于提供更优化的查找数据缓存。 除了编辑每个Web表单并用自定义版本替换内置的DropDownLists之外,您可以通过修改web.config让ASP.NET实现它:

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

Answer #10

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

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

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

DotNetNuke有一个非常好的HttpModule,它为他们友好的网站做到了这一点。 对于无法部署.NET v3.5的机器仍然有用。


Answer #11

在内容页面启用MasterPages的智能感知
我相信这是一个非常罕见的黑客攻击

大多数情况下,如果要使用它们,必须使用findcontrol方法并在内容页面的母版页中投射控件时, MasterType指令将在Visual Studio中启用intellisense,

只需添加一个指令到页面

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

如果你不想使用虚拟路径并使用类名来代替

<%@ MasterType TypeName="MyMainMasterPage" %>

here获取完整的文章


Answer #12

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

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

Answer #13

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

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

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


Answer #14

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

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

Answer #15

您可以使用:

 Request.Params[Control.UniqueId] 

为了获得控件的值BEFORE的viewstate被初始化(Control.Text等此时将为空)。

这对于Init中的代码很有用。


Answer #16

我脑海中有两件事情脱颖而出:

1)您可以打开和关闭代码的跟踪:

#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页面(在删除.designer.cs和.cs代码后,该VS已生成):

  <%@ 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中的控件,反之亦然,但是您需要记住检查控件是否存在空值。


Answer #17

这是最好的一个。 将此添加到您的web.config中以进行更快的编译。 这是通过这个QFE后3.5SP1。

<compilation optimizeCompilations="true">

快速总结:我们在ASP.NET中引入了一个新的optimizeCompilations开关,可以在某些情况下大大提高编译速度。 有一些捕获,所以阅读更多的细节。 此开关目前可用作3.5SP1的QFE,并将成为VS 2010的一部分。

ASP.NET编译系统采用非常保守的方法,可以消除任何时候“顶级”文件发生更改时所做的任何以前的工作。 “顶级”文件包括bin和App_Code中的任何内容以及global.asax。 虽然这适用于小应用程序,但它对于非常大的应用程序几乎不可用。 例如,一位客户遇到了一个案例,在更改“bin”程序集后,刷新页面需要10分钟。

为了缓解这种痛苦,我们增加了一种“优化”的编译模式,它采用了一种不太保守的重新编译方法。

通过here


Answer #18

默认情况下,自定义控件的标签之间的任何内容都将作为子控件添加。 这可以在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>

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

这将被ASP.NET返回,它将返回customErrors页面。 在最近的.NET每日提示帖中了解到这一点





.net