ASP.NET 4.0的ClientIDMode属性

时光流逝,我们心爱的ASP.NET也步入了4.0的时代,微软在ASP.NET 4.0中对很多特性做了修改。比如我将要讨论的控件ID机制就是其中之一。

在ASP.NET 4.0之前我们总是要为控件的ClientID头疼,比如明明一个叫lblName的Label放在一个叫做grd的GridView里面后,在页面上改 Label的ID就变成了诸如grd_clt02_lblName的一长串字符串,如果我们在前台想在使用JS的时候找到该Label,我们不得不用到 C#脚本来获得该Label在前台的确切ID,诸如:

<script type="text/javascript">var=""</script>

在ASP.NET 4.0中的每个控件上都多了一个叫做ClientIDMode的属性,这就是解决上面获取控件ID难的解决方案。这个属性有四个可选值,根据所选值的不同它可以控制页面上生成控件的ID格式。

下面就让我们来了解下ClientIDMode属性的四个值:

1,AutoID:

当控件的ClientIDMode选中为AutoID时,该控件的ClientID 值是通过串联每个祖先容器控件(诸如GridView、ListView、LoginView等就是容器性控件)的ID和父容器控件的ID和其本身的ID 值生成的,当然如果该控件没有在任何容器控件中其ClientID 值就是其本身的ID值,不会做任何更改。 另外如果该控件所在的父容器控件或祖先容器控件有些是显示多个数据行的容器控件(例如GridView、ListView就是显示多数据行的容器控件), 那么还将在这些容器控件的ID值的后面会插入一个递增的行号格式。 各部分之间以下划线字符 (_) 分隔。 可见在 ASP.NET 4 之前的版本中使用的就是AutoID方案来生成控件的ClientID 值。

比如下面这个GridView里面就有一个名叫Label1的ID,我们将Label1的ClientIDMode设置为了AutoID:


<asp:GridView ID="grd_Account" runat="server" AllowPaging="True" 
    AutoGenerateColumns="False" 
    DataKeyNames="Account Number" DataSourceID="sds_account" Height="63px" 
    Width="676px" PageSize="5" ClientIDMode="AutoID" >
    <Columns>
        <asp:TemplateField HeaderText="Account Number" SortExpression="Account Number">
            <ItemTemplate>
                <asp:Label ID="Label1" runat="server"
                    Text='<%# Bind("[Account Number]") %>' ClientIDMode="AutoID"></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

该GridView生成的客户端HTML代码就是:


<table cellspacing="0" rules="all" border="1" id="grd_Account" style="height:63px;width:676px;border-collapse:collapse;">
    <tr>
        <th scope="col">Account Number</th>
    </tr>
        <tr>
    <td>
            <span id="grd_Account_ctl02_Label1">1060</span>
        </td>
    </tr>
        <tr>
    <td>
            <span id="grd_Account_ctl03_Label1">1200</span>
        </td>
    </tr>
        <tr>
    <td>
            <span id="grd_Account_ctl04_Label1">1510</span>
        </td>
    </tr>
</table>

可以看到GirdView里面的Label形成了诸如grd_Account_ctl02_Label1格式的ClientID,而这正是:父容器
ID(grd_Account)+"_"+行号格式(ctl02)+"_"+控件自身ID(ClientID)这种格式生成的。

2,Static:

当控件的ClientIDMode选中为Static时,该控件的ClientID 值就是其本身设置的 ID 属性值,其ClientID值不会受到父容器控件的影响。

比如我们把上面的代码稍作修改,将Label1的ClientIDMode属性改为Static:


<asp:GridView ID="grd_Account" runat="server" AllowPaging="True" 
    AutoGenerateColumns="False" 
    DataKeyNames="Account Number" DataSourceID="sds_account" Height="63px" 
    Width="676px" PageSize="5"  >
    <Columns>
        <asp:TemplateField HeaderText="Account Number" SortExpression="Account Number">
            <ItemTemplate>
                <asp:Label ID="Label1" runat="server" Text='<%# Bind("[Account Number]") %>' ClientIDMode="Static"></asp:Label>
            </ItemTemplate>               
        </asp:TemplateField>
    </Columns>
</asp:GridView>

运行后查看得到的HTML代码:


<table cellspacing="0" rules="all" border="1" id="grd_Account" style="height:63px;width:676px;border-collapse:collapse;">
    <tr>
        <th scope="col">Account Number</th>
    </tr><tr>
        <td>
            <span id="Label1">1060</span>
        </td>
    </tr><tr>
        <td>
            <span id="Label1">1200</span>
        </td>
    </tr><tr>
        <td>
            <span id="Label1">1510</span>
        </td>
    </tr>
</table>

看到了吗,GridView里每行的Label1的ClientID都以自身ID的值出现了,不会受到父级容器控件的ID影响,这样在前台使用JS时我们就能通控件本身的ID值找到我们想要的控件了。

此外使用Static后势必页面中会出现很多同名的控件ID,只要这些同名ID的控件处于页面的不同层次(比如某一容器控件的内部和外部就是不同层次)上那么就不会出现问题,但是如果页面同一层次上有多个同ID的控件,那么页面就会报错。

3,Inherit:
这个属性其实没什么好说的,如果控件的ClientIDMode选中为
Inherit,那么表示该控件的ClientIDMode会使用父级容器控件的ClientIDMode值,如果父级容器控件的
ClientIDMode也为Inherit,那么会使用更上层容器控件的ClientIDMode值,直到回溯到页面的ClientIDMode值为
止,页面的ClientIDMode值默认为Predictable ,你可以在页面上的<%@
Page%>指令中对该值做更改。此外Inherit也是ASP.NET 4.0中所有控件的ClientIDMode属性的默认值。

4,Predictable:

首先我先说明下之所以最后写Predictable,是因为我发现控件的ClientIDMode为Predictable时生成ClientID
的机制会非常复杂,要分好几个部分分别进行讨论,其中还有特殊情况,所以我在这里只能说尽量将我发现的Predictable生成ClientID的机制
阐述清楚。

当控件的ClientIDMode选中为Predictable时,该控件的ClientID
值是通过串联父容器控件(诸如GridView、ListView、LoginView等就是容器性控件)的 ClientID
值生成的。另外如果该控件是在显示多个数据行的父容器控件或祖先容器控件中(例如GridView、ListView就是显示多数据行的容器控件),则还
会在该控件ClientID 值的末尾添加 ClientIDRowSuffix 属性中指定的数据字段的值。 对于 GridView
控件,ClientIDRowSuffix 属性可以指定多个数据字段。 如果 ClientIDRowSuffix
属性为空白,则在末尾添加递增的行号,而非数据字段值。 各部分之间以下划线字符 (_) 分隔。

以上是MSDN的说法,但是经过试验,我发现Predictable的特性更应该是用这么个式子来表达:

Inherit[+"_"+ClientIDRowSuffix]

意思就是说,如果一个控件的ClientIDMode选中为Predictable,那么在ASP.NET生成该控件的ClientID时首先会去
看该控件所属的父容器控件的ClientIDMode是什么值,然后先用该控件父容器控件的ClientIDMode规则生成该控件本身的
ClientID,最后如果该控件所属的父容器控件或祖先容器控件是显示多个数据行的容器控件,还会根据父容器控件或祖先容器控件的
ClientIDRowSuffix属性的值在该控件已生成的ClientID后面加上一个后缀字符串。

下面将几种情况逐一列出来单独解释:

<1>如果父容器控件的ClientIDMode值为AutoID

  • 如果父容器控件或祖先容器控件为显示多个数据行的容器控件,那么该控件的ClientID格式为:[父/祖先容器控件的ID+"_"+
    [行号格式+"_"]]+该控件自身ID+"_"+[ClientIDRowSuffix],其中ClientIDRowSuffix部分是什么后面会单
    独说明,其中:[父/祖先容器控件的ID+"_"+[行号格式+"_"]],就是该控件自身ClientIDMode值继承父容器控件
    ClientIDMode值AutoID生成的ClientID结果,其中的[行号格式+"_"]部分是否存在依赖于[父/祖先容器控件]部分是否是显示
    多个数据行的容器控件(这里不明白请看前面的AutoID部分)。
  • 如果父容器控件或祖先容器控件都不是显示多个数据行的容器控件,那么
    该控件的ClientID格式为:[父/祖先容器控件的ID+"_"]+该控件自身ID,可见这个格式就是该控件自身ClientIDMode值继承父容
    器控件ClientIDMode值AutoID生成的ClientID结果(这里不明白请看前面的AutoID部分)。

下面我就举一个父容器控件是多数据行容器控件且其ClientIDMode为AutoID的例子,将上面的代码再做更改,将Label1的
ClientIDMode属性值改为Predictable,并且设置其父容器控件grd_Account的ClientIDMode为AutoID:


<asp:GridView ID="grd_Account" runat="server" AllowPaging="True" 
    AutoGenerateColumns="False" 
    DataKeyNames="Account Number" DataSourceID="sds_account" Height="63px" 
    Width="676px" PageSize="5" ClientIDMode="AutoID" >
    <Columns>
        <asp:TemplateField HeaderText="Account Number" SortExpression="Account Number">
            <ItemTemplate>
                <asp:Label ID="Label1" runat="server" Text="Logged" ClientIDMode="Predictable"></asp:Label>
            </ItemTemplate>               
        </asp:TemplateField>
    </Columns>
</asp:GridView>

其生成的HTML代码为:


<table cellspacing="0" rules="all" border="1" id="grd_Account" style="height:63px;width:676px;border-collapse:collapse;">
    <tr>
    <th scope="col">Account Number</th>
    </tr>
    <tr>
    <td>
            <span id="grd_Account_ctl02_Label1_0">Logged</span>
        </td>
    </tr>
    <tr>
    <td>
            <span id="grd_Account_ctl03_Label1_1">Logged</span>
        </td>
    </tr>
    <tr>
    <td>
            <span id="grd_Account_ctl04_Label1_2">Logged</span>
        </td>
    </tr>
</table>

可以看到生成的Label的控件的ID诸如:grd_Account_ctl02_Label1_0正是上面所述格式:父容器控件的
ID(grd_Account)+"_"+行号格式(ctl02)+"_"+该控件自身ID(Label1)+"_"+
[ClientIDRowSuffix](0)。

<2>如果父容器控件的ClientIDMode值为Static

  • 如果父容器控件或祖先容器控件为显示多个数据行的容器控件,那么该控件的ClientID格式为:该控件自身ID+"_"+
    [ClientIDRowSuffix],其中ClientIDRowSuffix部分是什么后面会单独说明,其中:该控件自身ID,就是该控件自身
    ClientIDMode值继承父容器控件ClientIDMode值Static生成的ClientID结果(这里不明白请看前面的Static部
    分)。
  • 如果父容器控件或祖先容器控件都不是显示多个数据行的容器控件,那么该控件的ClientID格式为:该控件自身ID,可见这个
    格式就是该控件自身ClientIDMode值继承父容器控件ClientIDMode值Static生成的ClientID结果(这里不明白请看前面的
    Static部分)。

下面我就举一个父容器控件是多数据行容器控件且其ClientIDMode为Static的例子,将上面的代码再做更改,将Label1的
ClientIDMode属性值改为Predictable,并且设置其父容器控件grd_Account的ClientIDMode为Static:


<asp:GridView ID="grd_Account" runat="server" AllowPaging="True" 
    AutoGenerateColumns="False" 
    DataKeyNames="Account Number" DataSourceID="sds_account" Height="63px" 
    Width="676px" PageSize="5" ClientIDMode="Static" >
    <Columns>
        <asp:TemplateField HeaderText="Account Number" SortExpression="Account Number">
            <ItemTemplate>
                <asp:Label ID="Label1" runat="server" Text="Logged" ClientIDMode="Predictable"></asp:Label>
            </ItemTemplate>               
        </asp:TemplateField>
    </Columns>
</asp:GridView>

其生成的HTML代码为:


<table cellspacing="0" rules="all" border="1" id="grd_Account" style="height:63px;width:676px;border-collapse:collapse;">
    <tr>
    <th scope="col">Account Number</th>
    </tr>
    <tr>
    <td>
            <span id="Label1_0">Logged</span>
        </td>
    </tr>
    <tr>
    <td>
            <span id="Label1_1">Logged</span>
        </td>
    </tr>
    <tr>
    <td>
            <span id="Label1_2">Logged</span>
        </td>
        </tr>
</table>

可以看到生成的Label的控件的ID诸如:Label1_0正是上面所述格式:该控件自身ID(Label1)+"_"+[ClientIDRowSuffix](0)。

<3>如果父容器控件的ClientIDMode值为Predictable

  • 如果父容器控件或祖先容器控件为显示多个数据行的容器控件,那么该控件的ClientID格式为:父容器控件的
    ClientID+"_"+该控件自身ID+"_"+[ClientIDRowSuffix],其中ClientIDRowSuffix部分是什么后面会
    单独说明,可见这种情况才属于MSDN上所说的格式。
  • 如果父容器控件或祖先容器控件都不是显示多个数据行的容器控件,那么该控件的ClientID格式为:父容器控件的ClientID+"_"+该控件自身ID,可见这种情况才是MSDN上所说的格式。

下面我就举一个父容器控件是多数据行容器控件且其ClientIDMode为Predictable的例子,将上面的代码再做更改,将Label1
的ClientIDMode属性值改为Predictable,并且设置其父容器控件grd_Account的ClientIDMode也为
Predictable:


<asp:GridView ID="grd_Account" runat="server" AllowPaging="True" 
    AutoGenerateColumns="False" 
    DataKeyNames="Account Number" DataSourceID="sds_account" Height="63px" 
    Width="676px" PageSize="5" ClientIDMode="Predictable" >
    <Columns>
        <asp:TemplateField HeaderText="Account Number" SortExpression="Account Number">
            <ItemTemplate>
                <asp:Label ID="Label1" runat="server" Text="Logged" ClientIDMode="Predictable"></asp:Label>
            </ItemTemplate>               
        </asp:TemplateField>
    </Columns>
</asp:GridView>

其生成的HTML代码为:


<table cellspacing="0" rules="all" border="1" id="grd_Account" style="height:63px;width:676px;border-collapse:collapse;">
    <tr>
    <th scope="col">Account Number</th>
    </tr>
    <tr>
    <td>
            <span id="grd_Account_Label1_0">Logged</span>
        </td>
    </tr>
    <tr>
    <td>
            <span id="grd_Account_Label1_1">Logged</span>
        </td>
    </tr>
    <tr>
    <td>
            <span id="grd_Account_Label1_2">Logged</span>
        </td>
        </tr>
</table>

可以看到生成的Label的控件的ID诸如:grd_Account_Label1_0正是上面所述格式:父容器控件的ClientID(grd_Account)+"_"+该控件自身ID(Label1)+"_"+[ClientIDRowSuffix](0)。

<4>如果父容器控件的ClientIDMode值为Inherit

这种情况没什么好说的,因为父容器控件的ClientIDMode值会继承其所在更上层的祖先容器控件的ClientIDMode值,继承后也属于上面三种情况之一。

最后来说说ClientIDRowSuffix部分是什么,如果父容器控件或祖先容器控件是显示多数据行的容器控件(后面会讨论到如果控件的
ClientIDMode为Predictable,在判断该控件是否在显示多数据行的容器控件中时,会有一种特殊的穿透现象),那么父容器控件或祖先容
器控件会有个属性叫ClientIDRowSuffix,比如本例中的GridView的ClientIDRowSuffix属性,这个属性的作用是为设
定ClientIDMode值为Predictable的子控件生成ClientID的后缀字符串(就是上面那些ClientID格式中的
ClientIDRowSuffix部分):

如果 ClientIDRowSuffix 属性为空白,则在已生成的子控件ClientID末尾添加递增的行号并在行号前面加上下划线字符
(_)
分隔,比如上面的例子中由于都没有在GridView上设置ClientIDRowSuffix属性,所以ClientIDRowSuffix为空白,那
么生成的子控件ClientID最末位都有诸如_0、_1、_2等的递增行号。

此外还可以设置ClientIDRowSuffix
属性值为父容器控件或祖先容器控件中DataSource数据源中的字段,这样生成子控件ClientID的后缀字符串为
ClientIDRowSuffix 指定字段在该行的数据值,并且ClientIDRowSuffix
属性可指定多个DataSource数据源中的数据字段,那么在生成子控件ClientID时会将每个数据字段在该行的值用下划线字符 (_)
进行分隔然后作为ClientID后缀字符串。

现在就举个例子,将上面的代码再做更改将Label1的ClientIDMode属性值改为Predictable,并且设置其父容器控件
grd_Account的ClientIDMode也为Predictable,并且将grd_Account的ClientIDRowSuffix设置
为数据源sds_account的Account Number字段:


<asp:GridView ID="grd_Account" runat="server" AllowPaging="True" 
    AutoGenerateColumns="False" 
    DataKeyNames="Account Number" DataSourceID="sds_account" Height="63px" 
    Width="676px" PageSize="5" ClientIDMode="Predictable" ClientIDRowSuffix="Account Number" >
    <Columns>
        <asp:TemplateField HeaderText="Account Number" SortExpression="Account Number">
            <ItemTemplate>
                <asp:Label ID="Label1" runat="server" Text="Logged" ClientIDMode="Predictable"></asp:Label>
            </ItemTemplate>               
        </asp:TemplateField>
    </Columns>
</asp:GridView>

其生成的HTML代码为:


<table cellspacing="0" rules="all" border="1" id="grd_Account" style="height:63px;width:676px;border-collapse:collapse;">
    <tr>
    <th scope="col">Account Number</th>
    </tr>
        <tr>
    <td>
            <span id="grd_Account_Label1_1060">Logged</span>
        </td>
    </tr>
    <tr>
    <td>
            <span id="grd_Account_Label1_1200">Logged</span>
        </td>
    </tr>
    <tr>
    <td>
            <span id="grd_Account_Label1_1510">Logged</span>
        </td>
        </tr>
</table>

可以看到生成子控件的ClientID的后缀字符串为Account Number字段在GridView上每行的值:1060、1200、1500,其不再是递增的行号.

EX:最后Predictable还有一个很特别的特性:

当控件的ClientIDMode为Predictable且该控件在多个嵌套的容器控件中时,判断该控件是否在显示多数据行的容器控件中时,会具有层次穿透性,它不但会考察父容器控件,还会考察祖先容器控件。

下面就举个例子来说明这种情况,首先grd_Account为显示多数据行的容器控件,它的ClientIDMode设置为Static,在它内部
有一个ID为LoginView1的LoginView,我们知道LoginView也是容器性控件,只不过它不是显示多数据行的容器控件,这里设置
LoginView1的ClientIDMode属性为Predictable,在LoginView1里面再放置一个ID为Label1的Label,
它的ClientIDMode没有设置,所以其值也默认继承为Predictable,下面是代码:


<asp:GridView ID="grd_Account" runat="server" AllowPaging="True" 
    AutoGenerateColumns="False" 
    DataKeyNames="Account Number" DataSourceID="sds_account" Height="63px" 
    Width="676px" PageSize="5" ClientIDMode="Static" >
    <Columns>
        <asp:TemplateField HeaderText="Account Number" SortExpression="Account Number">
            <ItemTemplate>
                <asp:LoginView ID="LoginView1" runat="server" ClientIDMode="Predictable" >
                    <LoggedInTemplate>
                        <asp:Label ID="Label1" runat="server" Text="Logged"></asp:Label>
                    </LoggedInTemplate>
                </asp:LoginView>
            </ItemTemplate>               
        </asp:TemplateField>
    </Columns>
</asp:GridView>

可以看到在嵌套层次结构中,由于LoginView1所属的父容器控件grd_Account是显示多数据行的容器控件,所以LoginView1
的ClientID应该是诸如:LoginView1_0、LoginView1_1等有ClientIDRowSuffix部分的格式,这没有问题,但
是按道理来说Label1所在的父容器控件LoginView1不是显示多数据行的容器控件,那么Label1生成的ClientID
应该是诸如LoginView1_0_Label1、LoginView1_1_Label1等这样的没有ClientIDRowSuffix部分的格
式,但是为我们来看一下生成的HTML代码:


<table cellspacing="0" rules="all" border="1" id="grd_Account" style="height:63px;width:676px;border-collapse:collapse;">
    <tr>
    <th scope="col">Account Number</th>
    </tr>
    <tr>
    <td>
            <span id="LoginView1_0_Label1_0">Logged</span>    
        </td>
    </tr>
    <tr>
    <td>
            <span id="LoginView1_1_Label1_1">Logged</span>  
        </td>
    </tr>
    <tr>
    <td>
            <span id="LoginView1_2_Label1_2">Logged</span>
        </td>
    </tr>
</table>

可以看到生成的Label1的ClientID都带表示递增行号的后缀字符串0、1、2等(此外请注意LoginView不会产生HTML代码),也就是有ClientIDRowSuffix部分。

我们再将grd_Account的ClientIDRowSuffix属性更改为数据源中的Account Number字段后再来看看生成的HTML代码:


<table cellspacing="0" rules="all" border="1" id="grd_Account" style="height:63px;width:676px;border-collapse:collapse;">
    <tr>
    <th scope="col">Account Number</th>
    </tr>
    <tr>
    <td>  
            <span id="LoginView1_1060_Label1_1060">Logged</span>      
        </td>
    </tr>
    <tr>
    <td>  
            <span id="LoginView1_1200_Label1_1200">Logged</span>     
        </td>
    </tr>
    <tr>
    <td>
            <span id="LoginView1_1510_Label1_1510">Logged</span>     
        </td>
    </tr>
</table>

可以看到生成的Label1的ClientID也都带ClientIDRowSuffix部分,只不过ClientIDRowSuffix部分现在是数据源中Account Number字段的值。

由此可见在判断Label1是否在显示多数据行的容器控件中时,判定机制进行了穿透,即假如有这么一组嵌套的容器控
件:Control_1<-Control_2<-Control_3<-.......<-Control1_n-
1<-Control_n,其中Control_n的ClientIDMode设置或继承为Predictable,且其中Control_2到
Control1_n-1都不是显示多数据行的容器控件,只有最外层的Control_1是显示多数据行的容器控件,那么在判定最里面的
Control_n是否在显示多数据行的容器控件时,参考的是从里到外第一个是显示多数据行的容器控件Control_1(即从里到外只要任意一个容器控
件是显示多数据行的容器控件,就认为Control_n是在显示多数据行的容器控件中),并且Control_n的后缀字符串部分参考的也是
Control_1的ClientIDRowSuffix属性,从而忽略中间那些不是显示多数据行的容器控件(Control_2到
Control1_n-1),所以控件的ClientIDMode属性为Predictable时,就是用这种穿透判定来判断该控件是否在显示多数据行的
容器控件中的。

问题:ClientIDMode属性;结果:ASP.NET 4.0的ClientIDMode属性的更多相关文章

  1. ASP.NET 4.0的ClientIDMode属性

    时光流逝,我们心爱的ASP.NET也步入了4.0的时代,微软在ASP.NET 4.0中对很多特性做了修改.比如我将要讨论的控件ID机制就是其中之一. 在ASP.NET 4.0之前我们总是要为控件的Cl ...

  2. 如何使用Serilog.AspNetCore记录ASP.NET Core3.0的MVC属性

    这是Serilog系列的第三篇文章. 第1部分-使用Serilog RequestLogging减少日志详细程度 第2部分-使用Serilog记录所选的终结点属性 第3部分-使用Serilog.Asp ...

  3. ASP.NETCore 3.0 Autofac替换及控制器属性注入及全局容器使用

    1.Autofac基础使用 参考: https://www.cnblogs.com/li150dan/p/10071079.html 2.ASP.NETCore 3.0 Autofac 容器替换 需要 ...

  4. ASP.NET 4.0 ListView等容器控件中获取ClientID值与HTML中自动生成ID字符串不一样问题。

    ASP.NET 4.0 中 ClientIDMode的属性 可以设置获取不同ID格式的值. 项目中遇到的问题: 1.ListView1 ItemDataBound事件中,获取ClientID结果与自动 ...

  5. ASP.NET 4.0 :MasterPage母版页的ClientIDMode属性

    在ASP.NET 4.0之前我们总是要为控件的ClientID头疼,比如明明一个叫lblName的Label放在一个叫做grd的GridView里面后,在页面上改Label的ID就变成了诸如grd_c ...

  6. windows2003 IIS6.0右键属性没有asp.net选项卡的解决办法

    windows2003 IIS6.0右键属性没有asp.net选项卡的解决办法 1,如果是只安装了.net framework 1.1 在iis中是不显示那个选项卡的.默认就会支持asp.net1.1 ...

  7. ASP.NET 4.0 来了

    伴随着VS2010的公开测试,ASP.NET4.0也进入了我们的视线.ASP.NET4.0究竟给我们带来了什么,将在哪些方面提高我们的生产力? 在何时你需要使用ASP.NET4.0开发你的网站程序? ...

  8. Log4Net异常日志记录在asp.net mvc3.0的应用

    前言 log4net是.Net下一个非常优秀的开源日志记录组件.log4net记录日志的功能非常强大.它可以将日志分不同的等级,以不同的格式,输出到不同的媒介.本文主要是简单的介绍如何在Visual ...

  9. 2.3属性在 ASP.NET Web API 2 路由

    路由是 Web API 如何匹配 URI 的行动.Web API 2 支持一种新型的路由,称为属性路由.顾名思义,属性路由使用属性来定义路由.属性路由给你更多的控制 Uri 在您的 web API.例 ...

随机推荐

  1. loopback v4 特性

    loopback 是一个api 服务框架,挺方便的,同时也已经演进了好几代了v4 有一些新功能的 支持 新特性 基于typescript/es2017 开发 openapi 驱动的rest api 开 ...

  2. hybrid app 知识点

    WebView能加载显示网页,可以将其视为一个浏览器. Android系统中,叫做 WebView ios系统中,新版是 WKWebView,旧版是 UIWebView Native App 和 We ...

  3. MySqli 执行多条SQL语句

    使用multi_query();  去执行SQL语句,执行多条语句多个SQL语句用“;”分开 一:没有结果集的语句: $sql="insert into products (cid,name ...

  4. 2013-8-6 ubuntu基本操作

    1,apt-get下载文件默认安装路径 apt-get 下载后,软件所在路径是什么?? /var/cache/apt/archives ubuntu 默认的PATH为 PATH=/home/brigh ...

  5. PREV-1_蓝桥杯_核桃的数量

    问题描述 小张是软件项目经理,他带领3个开发组.工期紧,今天都在加班呢.为鼓舞士气,小张打算给每个组发一袋核桃(据传言能补脑).他的要求是: 1. 各组的核桃数量必须相同 2. 各组内必须能平分核桃( ...

  6. Mybatis学习(4)输入映射、输出映射、动态sql

    一.输入映射: 通过parameterType指定输入参数的类型,类型可以是简单类型.hashmap.pojo的包装类型 1) 传递pojo的包装对象 需求是:完成用户信息的综合查询,传入的查询条件复 ...

  7. 服务注册发现consul之五:Consul移除失效服务的正确姿势

    spring cloud微服务不定期会出现网络请求失败的错误.于是看了下后台日志,发现有几个请求会报如下的异常: Caused by: feign.RetryableException: Connec ...

  8. ASP.NET Web Pages:简介

    ylbtech-.Net-ASP.NET Web Pages:简介 ASP.NET 是一个使用 HTML.CSS.JavaScript 和服务器脚本创建网页和网站的开发框架. ASP.NET 支持三种 ...

  9. Discuz论坛管理的问题汇总

    Discuz论坛在Linux上搭建成功了, 不得不说, 其功能是非常强大的, 可以满足已知的绝大多数的需求. 搭建完成后也有一些问题, 在这里汇总一下, 以便将来查阅. 1. 显示未处理用户信息, 但 ...

  10. java ssl https 连接详解 生成证书 tomcat keystone

    java ssl https 连接详解 生成证书 我们先来了解一下什么理HTTPS 1. HTTPS概念 1)简介 HTTPS(全称:Hypertext Transfer Protocol over ...