posts - 17,  comments - 214,  trackbacks - 9
  2007年8月13日
      我们都知道asp.net的服务端控件在呈现到浏览器的时候生成的代码还是HTML代码,但为何它就行保存上次输入的值呢?
      在设计的时候我们写一句<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>,但在页面代码中我们会看到<input name="TextBox1" type="text" id="TextBox1" />但还看到<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUJMjgzMDgzOTgzZGRqBJ2DrJA0WVW8LiR3445iRDt1sg==" />
      同样的代码,我只是把TextBox给一个初始化数据<asp:TextBox ID="TextBox1" runat="server" Text="this text value"></asp:TextBox>,在页面代码中会看到<input name="TextBox1" type="text" value="this text value" id="TextBox1" />和<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUJMjgzMDgzOTgzZGRqBJ2DrJA0WVW8LiR3445iRDt1sg==" />
      看了这两次生成的代码没什么变化,只是输入框的值变了,在浏览器中输入值后,回传了一次后代码也只是输入框的value改变了。
      在没有深入了解asp.net服务端控件的生成及其值的保存前,就以为它的值就只靠value属性,但后来发现没那么简单。每个控件的值都会保存到ViewState中。(这里我就不说太多有关ViewState了,因为自己研究得还不够深入,怕说错了)
      在项目开发中,我们经常用到日历控件,但服务端的日历控件要回传,刷新界面,这给用户使用感觉很不好,在网上有很多Js日历控件,直接可以使用的,但我们经常是不给用户手动输入,只能选择,在代码设计时一般是写<asp:TextBox ID="txtCalendar" ReadOnly="true" runat="server" onclick="showCalendar();"></asp:TextBox>没给它一个初始日期,它的值通过JS来填充的。当我们点击提交的时候,总得不到它的值,都是空串,就算是给了初始化日期,在浏览器中已经改变它的值,但提交到cs代码中,日期还是初始化的那个,这是怎么回来呢?
      把输入框设为只读后,也就只有后台cs代码才能修改这个输入的ViewState的值了。
      我们可以通过HiddenField代替它,在JS中修改输入框的值的同时也把它的值给一份给HiddenField,在后台的cs代码直接取得HiddenField的值就可了。这是个投机取巧的方法,在很多时候我们用JS在界面做的一些值的修改,回到cs代码里都得不到自己要得到的值,因为JS没有直接修改到ViewState,我们只能通过这些小方法得到。
      上面所说的不一定正确,如果那位朋友感得问题,请指入。谢谢!
posted @ 2007-08-13 22:54 SouthSea 阅读(1233) | 评论 (10)编辑
       这段时间手里有个有关订单的项目,订单一般有个状态的,以前很多要时候都会想到订单的状态就那几个种,就把它写死吧,不用一个数据库表了,太浪费资源了,但写死了用一个数字来代表一种订单状态,这样在编码时还要记得什么数字代码什么状态,如果不小心把它写错了,会导致数据出错。
      后来想到.NET有个枚举,这么好的东西为何不用上来呢,这不但可以方便以后的代码维护,也方便编码。
public enum OrderState
{
    
/// <summary>
    
/// 无效状态
    
/// </summary>

    Invalid = 0,
    
/// <summary>
    
/// 客户询价
    
/// </summary>

    CustomerQuery = 1,
    
/// <summary>
    
/// 客户落单
    
/// </summary>

    CustomerOrdered = 2,
    
/// <summary>
    
/// 客户付款
    
/// </summary>

    ReceiverCustomerPayment = 4,
    
/// <summary>
    
/// 向供货商订货
    
/// </summary>

    SupplierOrdered = 8,
    
/// <summary>
    
/// 供货商确认货期
    
/// </summary>

    SupplierOrderTerm = 16,
    
/// <summary>
    
/// 收到货品
    
/// </summary>

    RecieverGoods = 32,
    
/// <summary>
    
/// 客户取消订单
    
/// </summary>

    CustomerCanceled = 64,
    
/// <summary>
    
/// 供货商取消订单
    
/// </summary>

    SupplierCancelded = 128
}
但要从UI层看这些状态怎么处理呢?
利用switch case
public static string GetOrderStateString(OrderState state)
    
{
        
switch (state)
        
{
            
case OrderState.Invalid:
                
return "无效值";
            
case OrderState.CustomerOrdered:
                
return "客户下单";
            
case OrderState.CustomerCanceled:
                
return "客户取消订单";
            
case OrderState.CustomerQuery:
                
return "客户询价";
            
case OrderState.ReceiverCustomerPayment:
                
return "客户已付款";
            
case OrderState.RecieverGoods:
                
return "订单到货";
            
case OrderState.SupplierCancelded:
                
return "供货商取消";
            
case OrderState.SupplierOrdered:
                
return "已向供货商订货";
            
case OrderState.SupplierOrderTerm:
                
return "供货商确认货期";
        }

        
return "";
    }

如果以后还有更多的订单状态就修改这个枚举和一个方法就行了,这么方便的东西为何就不用到我的程序中呢,我们在编码中,要想尽方法使代码简单、易用、易维护。
枚举中有两个很实用的方法
1、GetHashCode()   //返回该实例的值的哈希代码
2、ToString()           //将此实例的值转换为其等效的字符串表示

这两个方法在编码的时候会用到,GetHashCode()这个方法使用机会会更多。
有前枚举的使用,我得出以上一点心得,与大家共享一下。

posted @ 2007-08-13 21:22 SouthSea 阅读(2673) | 评论 (38)编辑