zoukankan      html  css  js  c++  java
  • 【WebForm】知识笔记

    1、ashx介绍以及ashx文件与aspx文件之间的区别

      ashx是什么文件?

    .ashx 文件用于写web handler的。

    .ashx文件与.aspx文件类似,可以通过它来调用HttpHandler类,它免去了普通.aspx页面的控件解析以及页面处理的过程。其实就是带HTML和C#的混合文件

    .ashx文件适合产生供浏览器处理的、不需要回发处理的数据格式,例如用于生成动态图片、动态文本等内容

    ashx文件是.net 2.0新加的文件类型(其实在.net 1.0下已经可用,但是没有公开提供).

    ashx文件和aspx文件有什么不同? 我们先新建一个ashx文件看看:

    代码示例:
    当然你完全可以用.aspx 的文件后缀。使用.ashx 可以让你专注于编程而不用管相关的WEB技术。.ashx必须包含IsReusable

    <% @ webhandler language="C#" class="AverageHandler" %>
    
      using System;
      using System.Web;
      public class AverageHandler : IHttpHandler
      {
          public bool IsReusable
          { get { return true; } }
    
          public void ProcessRequest(HttpContext ctx)
          {
              ctx.Response.Write("hello");
          }
      }   
    View Code

    .ashx比.aspx的好处在于不用多一个html

    比aspx简洁多了,只有一个文件,没有后台cs文件(基于代码安全考虑,后边我们会自己添加这个文件)

    .ashx对比aspx文件就好像 少了cs文件,其实这就是ashx和aspx不同的地方,因为aspx要将前后台显示和处理逻辑分开,所以就弄成了两个文件。

    其实,在最终编译的时候,aspx和cs还是会编译到同一个类中去,这中间就要设计html的一些逻辑处理。

    而ashx不同,它只是简单的对web http请求的直接返回你想要返回的结果,比aspx少处理了html的过程,理论上比aspx要快。

    看看.net config文件中对两个文件类型请求的配置吧

    <add path="*.aspx" verb="*" type="System.Web.UI.PageHandlerFactory" validate="True" />
    <add path="*.ashx" verb="*" type="System.Web.UI.SimpleHandlerFactory" validate="True" />

    可以看到两个文件处理的类不一样(ashx处理的类叫SimpleHandleFactory,既然叫Simple,应该处理过程也比较 Simple,响应速度也应该快点吧:)

    2、DropDownList 动态绑定数据

    前端源代码效果及后端代码,分别如下

    <asp:DropDownList ID="ddlCurrencyCode" runat="server" Width="173">
    <asp:ListItem Text="全部" Value="" />
    <asp:ListItem Text="人民币" Value="RMB" />
    <asp:ListItem Text="港币" Value="HKD" />
    </asp:DropDownList>
    this.ddlCurrencyCode.Items.Clear();
    this.ddlCurrencyCode.Items.Add(new ListItem { Value = "", Text = "全部" });
    ListItem listItem;
    list.ForEach(item =>
                    {
                        listItem = new ListItem();
                        listItem.Text = item.Key;
                        listItem.Value = item.Key;
                        this.ddlCurrencyCode.Items.Add(listItem);
                    });

    3、动态控制颜色

    <td align="center" style='color:<%# Container.ItemIndex == 0 ? "green":"red"%>'>

    4、CheckBoxList动态绑定数据、CheckBox设置间距

    <asp:CheckBoxList ID="chklSellChannelID" runat="server" RepeatDirection="Horizontal" RepeatLayout="Flow"></asp:CheckBoxList>

    后端:

    var lists = new BasicInfoPresenter().ConvertHotelSellChannel(SellChannels);
                chklSellChannelID.DataSource = lists;
    //根据lists的字段 去设置控制的value和text
                chklSellChannelID.DataValueField = "HotelSellChannelId";
                chklSellChannelID.DataTextField = "ChannelName";
                chklSellChannelID.DataBind();
                foreach (ListItem item in chklSellChannelID.Items)
                {
    item.Attributes.Add("style", "display:block;margin-right:20px;float:left;");
                    if (item.Value.Contains($"{(int)SellChannelType.Static}") || item.Value.Contains($"{(int)SellChannelType.CB}"))
                    {
                        item.Selected = true;
                        item.Enabled = false;
                    }
                    if (item.Value.Contains($"{(int)SellChannelType.Dynamic}"))
                    {
                        item.Selected = false;
                        item.Enabled = false;
                    }
                }
    View Code

    CheckBox选中的判断:

    ListItem _list;
                foreach (var ctl in chklSellChannelID.Items)
                {
                    if (ctl is ListItem)
                    {
                        _list = (ListItem)ctl;
                        if (_list.Selected == true)
                        {
                          }
                    }
                }
    View Code

    5、asp.net使用include包含文件

      用asp.net使用include包含文件?……有必要吗?使用“用户控件”不是更好吗?

    当然,绝大多数情况下,用户控件都能解决问题。但若要在用户控件中需包含其他公用块,即使用用户控件嵌套,老是出问题,而且也没必要使用asp.net的用户控件,因为我要包含的块是静态的,例如在head中包含一个logo……

    1、asp.net页面也可以像asp那样,用include来包含文件:

    <div class="includeParent">
        3.include htm:
        <!--#include file="include/HeadAd.htm"-->
    </div>

    2、也可以包含有服务端代码的aspx或ascx文件,但它必须是动态编译的文件(是CodeFile或单文件,而非CodeBehind编译的)。

    <div class="includeParent">
        4.include aspx:
        <!--#include file="include/HeadNav.aspx"-->
    </div>
    <div class="includeParent">
        5.include ascx:
        <!--#include file="include/HeadNav.ascx"-->
    </div>

    HeadNav.aspx和HeadNav.ascx的内容示例:

    <div class="includeDiv"><%=Guid.NewGuid().ToString()%></div>

    3、也可以使用asp.net的“Response.WriteFile”方法,但仅限于静态文件:

    <div class="includeParent">
        1.WriteFile htm:
        <%Response.WriteFile("include/HeadAd.htm");%>
    </div>

    实际应用,将图片放NavLogo.html中当公共页面,被多个页面共享,发生修改时只改一处即可。

     

    NavLogo.html的内容如下:

    <div class="logo-grop">
        <img class="logo" src=<%=System.Web.Configuration.WebConfigurationManager.AppSettings["navLogoImg"] %> title="logo" />
    </div>

    6、aspx前台写后台代码控制显示与否

      有时候在一个Table中展示了一些列,但是可能某一列只在特殊条件下 才要展示出来。那就可以在前台写C#代码来控制。

    利用 <% %>来控制,在后台定义一个bool型变量VisibleInfo作为控制。

     <tr>
                            <th width="14%" height="20" >原幣</th>
                            <th width="10%" >匯率</th>
                            <th width="14%">港幣</th>
                            <th width="14%" >提交港幣</th>
                            <th width="14%" >實收金額 </th>
                            <% if (VisibleInfo)
                                {
                            %>
                            <th style="16%">ctrip促銷</th>
                            <%} %>
                            <th width="34%">優惠</th>
                        </tr>
                       
                <tr>
                            <td align="center">
                                <asp:Literal ID="original" runat="server"></asp:Literal></td>
                            <td align="center">
                                <asp:Literal ID="exchangeRate" runat="server"></asp:Literal></td>
                            <td align="center">
                                <asp:Literal ID="dollarhk" runat="server"></asp:Literal></td>
                            <td align="center">
                                <asp:Literal ID="submit" runat="server"></asp:Literal></td>
                            <td align="center">
                                <asp:Literal ID="receivedAmount" runat="server"></asp:Literal>
                            </td>
                             <% if (VisibleInfo)
                                 {
                            %>
                            <td style="text-align: center">
                                <asp:Literal ID="PromotionPrice" runat="server"></asp:Literal></td>
                            <%} %>
                            <td align="center">
    View Code

    7、asp.net几种数据绑定方法

    •  使用<%= %> ,=后面接后端的变量或者有返回值的方法,且他们的访问修饰符为protected或者public

    例如:(1)前端代码:

    <span><%=Content%></span>

    后端代码:

    public string Content; 
    protected void Page_Load(object sender, EventArgs e) { Content="this is a demo!" }

    <span><%=Content%></span>等价于<span>this is a demo!</span>

    提示:Content必须是公有或者受保护的变量

    也可以是后端的方法

    <span><%=getName()%></span>
    • 使用<%#Eval()%>方法,该方法用于定义单向(只读)绑定

    绑定数据的字段,一般用在数据绑定控件DataBind()方法执行时被执行

    <asp:Lable id="lable1" runat="server" Text='<%#DataBind.Eval(Container.DataItem,"UserName")%>'/>
    简化版
    <asp:Lable id="lable1" runat="server" Text='<%#Eval("UserName")%>'/>
    • 使用<%#Bind()%>方法,该方法用于定义双向(可读可写)绑定
    <asp:Lable id="lable1" runat="server" Text='<%#Bind("UserName")%>'/>
    • 数据绑定表达式,<%# 数据绑定表达式%>,数据绑定表达式可以是一个变量,也可以是一个带返回值的c#方法

    例如:

    <li>
    <span><%#getName()%></span><!--getName()为一个后台有返回值的方法-->
    </li>
    <li>
    <span><%#UserNake%></span><!--UserName为后台一个公有或受保护的变量-->
    </li>

    提示:上诉<%#%>数据绑定方法用于服务器控件,必须通过DataBind()绑定数据源

    8、WebForm 之 Ajax 请求后端处理

      通常采用一般处理程序(.ashx)来处理,新建一个页面和一般处理程序

    aspx前端页面,创建表单元素

    <body>
        <div>
            用户名:<input type="text" id="name"><br />
            密 码:<input type="text" id="pwd" />
        </div>
        <div>
            <input type="button" value="提交" onclick="javascript:submit();" />
        </div>
    </body>
    View Code

    点击 "提交" 按钮 往后台异步请求,并弹出后台返回的文本数据。

    async 默认值: true。默认设置下,所有请求均为异步请求。如果需要发送同步请求,请将此选项设置为 false。

    注意,同步请求将锁住浏览器,用户其它操作必须等待请求完成才可以执行。

    <script type="text/javascript">
        var submit = function () {
            var name = $("#name").val();
            var pwd = $("#pwd").val();
            $.ajax({
                url: "WebFormAjaxDemo.ashx",
                type: "post",
                data: { "name": name, "pwd": pwd, "requestMethod": "register" },
                dataType: "text",
                //async: false,
                beforeSend: function (XHR) {
                },
                complete: function (XHR, TS) {
                },
                success: function (data) {
                    alert(data);
                }
    
            });
        };
    </script>
    View Code

    一般处理程序的后台处理前台发送的请求,并返回处理的结果。

    public void ProcessRequest(HttpContext context)
            {
                // 接收前台要请求的方法
                string requestMethod = context.Request["requestMethod"];
    
                // 存储返回结果
                string returnResult = string.Empty;
                // 这种方式可以处理前台的多种异步请求
                switch (requestMethod)
                {
                    case "register":
                        {
                            returnResult = Register();
                        } break;
                    default:
                        { returnResult = "no method"; } break;
    
                }
                // 返回处理结果
                context.Response.Write(returnResult);
            }
    
    /// <summary>
            /// 注册
            /// </summary>
            /// <returns></returns>
            public string Register()
            {
                // 获取表单数据
                var name = HttpContext.Current.Request["name"];
                var pwd = HttpContext.Current.Request["pwd"];
    
                if (pwd == "123")
                {
                    return "ok";
                }
                return "no";
            }
    View Code

     不过实在不想新建一般处理程序ashx,而采用aspx.cs后端也可以,例如:

    function AjaxRquest() {
                $.ajax({
                    url: location.href,
                    type: "POST",
                    data: { "RequestType": "AjaxRequest", "id": "1" },//模拟个数据
                    success: function(data) {
                        alert(data);
                    }
                });
            }
    View Code
    protected void Page_Load(object sender, EventArgs e)
        {
            if (Request["RequestType"] == "AjaxRequest")
            {
                string id = Request["id"];
                Response.Clear();
                Response.Write("ID : " + id + " ," + DateTime.Now);
                Response.End();
                return;
            }
        }
    View Code

    9、.aspx文件都以Page指令开始

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Home.aspx.cs" Inherits="GENV.Home" %>

    Page指令指定了页面所采用的语言,并且告诉ASP.NET从哪里可以找到关联的代码文件。

    AutoEventWireup="true"以自动方式将页事件与方法相关联。CodeFile特性指定包含代码隐藏的文件,Inherit特性指明正在使用的类(partial class分部类,后台代码的类名)

     <%@Register src="xxxx.ascx" %>引用一个用户控件,将它注册到当前页面来使用。

    10、Http中Get/Post请求区别

    对于get方式,服务器端用Request.QueryString获取变量的值,

    对于post方式,服务器端用Request.Form获取提交的数据。

    eg: 

    get方式 <a href="View.aspx?cityid=CITY0001"><liclass="li2"></li></a>  后端 String cityID =Request.QueryString["cityid"];

    post方式  var url ="Handler/ViewHandler.ashx";
                    $.post(url, {type:"getCheChangByID",id: id......  后端 string ID = context.Request["id"];

     

     

  • 相关阅读:
    NaN数值类型
    模板字符串
    一文带你速懂虚拟化KVM和XEN
    CentOS 8配置本地yum源及DNF简介
    fxksmdb.exe 是什么进程?
    入行IT,一定要会Linux吗?
    干货|Linux平台搭建网关服务器
    忘带U盘了??别急!一行python代码即可搞定文件传输
    手把手教你如何搭建一个私有云盘
    误删重要文件怎么办?学会Linux 救援模式再也不担心
  • 原文地址:https://www.cnblogs.com/peterYong/p/10679357.html
Copyright © 2011-2022 走看看