• ASP.NET 开发知识小结


    做了几年的ASP.NET,积累了不少小技巧。但是技巧只适合于特定的环境,还不如加强对基础知识的理解与运用。下面是我的一点体会,与大家分享。

    1 母版页
    这个控件可以使我忘记html的iframe之类的页面框架方案,还有frameset.
    asp开发中还支持<#include file=”head.asp>
    现在有母版页可以轻松的以.NET的方式来进行编写页面。
    1)  在母版页对应的内容页中,查找母版页中的控件 ,并给它赋值
    MasterPage.FindControl(“lblTitle”)=”New Request”
    2) 母版页中使用JavaScript,取到文本控件的值,验证它是否合法
    ’<=txtUserName.ClientID>’

    2 User Control 不常用,但是有时候会用到。比如,为了统一不同用户的页面地址,把不同角色的页面放到User Control中,而在同一个页面中,根据当前登陆的用户判断,加载不同的User Control
    新建立二个文件,PM.ascx, GM.ascx分别对应于角色是PM和GM时的页面,在页面中作如下判断
    UserControl uc
    swith(role)

    {
    case “PM”
       uc=(UserControl) LoadControl(“~/PM.ascx”); break;
    case ‘GM” 
       uc=(UserControl) LoadControl(“~/GM.ascx”); break;
    }
    placeHolder.Controls.Add(uc);
    placeHolder是在页面上放置的一个PlaceHolder控件。


    3  数据源控件 用法举例
    把数据库的字段绑定到DropDownList 控件中
    <asp:DropDownList ID="ddlEndCustomer" runat="server" Width="130" DataTextField="ShortName"
          DataValueField="ShortName" DataSourceID="sqlEndCustomer">
          </asp:DropDownList>
          <asp:SqlDataSource ID="sqlEndCustomer" runat="server" ConnectionString="<%$ ConnectionStrings:HTSystemConnectionString %>"
           SelectCommand="SELECT LTRIM(RTRIM([ShortName]))  [ShortName] FROM [Customer] "> </asp:SqlDataSource>

    再来一个XmlDataSource
    <asp:DropDownList ID="ddlPartResin" runat="server" Width="130" DataSourceID="xmlLedgerAcc"  DataTextField="Text" DataValueField="Value">
                   </asp:DropDownList>
    <asp:XmlDataSource ID="xmlLedgerAcc" DataFile="~/App_Data/PartResin.xml" runat="server"     XPath="Items/Item"></asp:XmlDataSource>
    Xml文件格式如下
    <?xml version="1.0" encoding="utf-8" ?>
    <Items>
      <Item Text="ABS" Value="ABS"></Item>
      <Item Text="HIPS" Value="HIPS"></Item>
      <Item Text="PA" Value="PA"></Item>
    </Items>

    对于ObjectDataSource,用的不熟练,没有在项目开发中使用。SqlDataSource 也很少直接用于GridView的数据绑定,数据库中的数据,通常需要转换一下,用这个控件还要重新写代码,还不如直接写代码来的方便。
    举例,数据库中有一个字段,smallint类型,1表示男,0表示女。用程序判断一下才可以绑定到控件中去。SQL写法如下
    SELECT Sex=CASE WHEN Sex=1 THEN ‘Man’
                                 WHEN Sex=0 THEN ‘Woman’
                   END
    FROM Employee

    4  资源文件
    通常要放置一些提示字符串,比如“操作成功”,“新增业务订单失败”之类的,分散在各个类中,不好管理,也不容易统一风格。用资源文件可以有效的解决这个问题
    新建2个文件,Strings.aspx.en-us.resx,Strings.aspx.resx
    在文件里面写明字符串资源的值的键,在页面的后台代码中调用
    Bitmap img = (System.Drawing.Bitmap)GetGlobalResourceObject(
               "MyGlobal", CultureInfo.CurrentCulture.Name);
    (string)GetGlobalResourceObject("MyGlobal", "GlobalText"); 
    (string)GetLocalResourceObject("lbl.Text");
    如代码所示,可以从全局的资源文件或局部资源文件中取出相应的资源,可以是字符串,也可以是图片

    5 验证控件
    <asp:TextBox ID="txtUserName" runat="server" />
      <asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server" ErrorMessage="RequiredFieldValidator"  Display="None"         ControlToValidate="txtUserName"></asp:RequiredFieldValidator>
    验证用户名是必须输入的,否则不允许提交
    如果你用了验证控件,页面上的按钮的默认属性CausesValidation=true,每一个按钮是会触发验证的。
    上周帮忙同事看一个问题,如下图
     image

    这是选择用户的页面,点击>按钮把员工添加到右边的ListBox中去。
    我的同事拷贝我的代码过去,点击>按钮,页面事件没有任何反应,debugger也不能中断。
    我仔细检查他的页面代码,发现他使用了ASP.NET的验证控件,验证控件本身不显示错误提示,如代码所示Display="None"   ,把所有的验证提示放到ValidationSummary,偏偏他的代码中又没有拷贝这个控件,所以怎么也找不到问题。我告诉他把>按钮的CausesValidation设为false,按钮开始正常工作。

    6  Themes用的不多,不如在CSS文件中设置方便。 
    Membership虽然是可扩展的,可是MS做了那么多存储过程,关系复杂,自己很少用。
    我有见过在Win Forms应用程序中,应用aspnetdb作为用户验证数据库,自己在Web开发都没有用到,居然有人在Win Forms中应用,可见它还是具有典型的意义。aspnetdb还提供了一个管理工具,可以直接添加用户,添加角色,这可以快速搭建一个角色权限数据库,验证系统用户。
    Security通常是Form验证。我们公司内部局域网以域方式管理,相互信任的关系,改选用Windows验证方式,用每个电脑的Login ID作主用户名标识,当发现数据库中不存在该用户时,调出引导注册页面,让用户注册,然后管理员审核一下他的角色,赋予相应的权限就可以。

    Profile也很少用,估计这东东和Portal Framework关系密切,几乎没有用。
    有用户提到过一个需求,为每个输入窗体配置一些默认值,方便他快速的输入数据。因为角色是几乎不变的,要输入的数据,通常就那几个类别,我弄成DropDownList 供他选择,还不够方便,最好直接帮忙他选择一个默认值,这个默认值在80%的情况下是正确的。
    估计这个功能用Profile来做会比较轻松,在新版本中考虑用这个特性来做。

    6 Cache
    在ASP.NET 1.1时代做过一个方案,要做一个多语言的ASP.NET应程序,把语言放置到Xml中,写成zh-cn.xml,en-us.xml,zh-tw.xml,然后在界面中读取这个文件,给界面元素赋值。
    当是没有用缓存,有高人提示,这个文件的内容几乎不会变化,应该主动用文件依赖缓存,加快读取速度。
    还有个争持,是用HttpContext.Cahce,还是用HttpRuntime.Cache,页面的Cache肯定是最糟糕的方案。那时我笨,也没有分清楚这两个的关系。现在你应该知道是用拿一个,否则要查一个MSDN。
    上一段代码,练下手
    if (Cache["key"] == null)
           {
           Cache.Insert("key", DateTime.Now, null, DateTime.Now.AddSeconds(10), TimeSpan.Zero);
           }
    DateTime dt = (DateTime)Cache["key"];
    缓存的使用模式是要先判断是否存在,不存在要刷新缓存,否则直接取值
    if(Cache[“Name”]==null)
       Cache.Insert("Name", DateTime.Now, null, DateTime.Now.AddSeconds(10), TimeSpan.Zero);
    txtUserName.Text=Convert.ToString(Cache[“Name”]);
    当有大量的缓存键值对时,最好也做个CacheManager,统一管理键值对,减少出错。

  • 相关阅读:
    docker删除常见命令
    测试网中用户添加docker yum源
    kafka 重新分配partition
    docker-compose常用命令
    docker 常用命令
    docker-compose部署ELK
    ELK全Dokcer 部署
    Harbor修改/data目录位置
    单机多es容器服务部署的网络模式
    C++使用模板类时出现LNK2019 unresolved external symbol错误.
  • 原文地址:https://www.cnblogs.com/JamesLi2015/p/1661294.html
Copyright © 2020-2023  润新知