2009年12月7日

大家都知道使用实体这些自动生成的代码是无法直接使用数据标识的,因为每次刷新数据库改动的时候,就会导致在框架类上添加的标识丢失的问题,这个问题困扰了我很久.话不多说,直接上代码.

 

 

代码
    
//假设下面的类是由实体框架生成
public partial class Kids
    {
        
public string writeKidsProperty()
        {
            
//return string.Format("this is Kids: {0}|{1}", this.Kid_Age, this.Kid_Name);
        }

        
public string Kid_Name { getset; }
        
public int  Kid_Age { getset; }
    }

 

 

 

代码
//通过伙伴类和sealed封闭特性,自动把后来添加的特性附加到最原始的kids类中的属性去.  
 [MetadataType(typeof(Kids.Metadata))]
    
public partial class Kids
    {

        
private sealed class Metadata
        {

            [Required]
            
public string Kid_Name { getset; }

            [Required]
            
public int Kid_Age { getset; }

        }
    }

 

 

生成Kids对象的时候,Kids的属性就有相关的[Required]特性了...

目前这个方法虽然通过了验证,但是,如果你通过反射获取Kids.Kid_Name的特性的时候,是无法获取[Required]特性的,这个一直让我百思不得其解,如果有此经验的朋友,麻烦告诉我方法.谢谢.

posted @ 2009-12-07 10:10 gxpotato 阅读(235) 评论(0) 编辑


2009年12月3日

先前用TryUpdateModel,发现貌似不能保存例如某个字段为DateTime.Now对象的,或者有主从表的时候不知道怎么保存对应的从表id对象.如果有知道的朋友麻烦PM我.谢谢..

因此,写了这个方法,用于自动保存提交的表单,单独处理的就用另外一个参数进行处理,性能方面暂时不考虑.反射是个好东西.

 

 

代码
public string  AutoSave(object InObj,object otherAttributes)
        {
            
string err = string.Empty;
            Type objType 
= InObj.GetType();
            PropertyInfo[] objPro 
= objType.GetProperties(BindingFlags.Public|BindingFlags.Instance);
            
foreach (PropertyInfo property in objPro)
            {

                
if (otherAttributes.ToString().IndexOf(property.Name) == -1)
                {
                    
if (Request[property.Name] != null)
                    {
                        
try
                        {
                            objType.GetProperty(property.Name).SetValue(InObj, Convert.ChangeType(Request[property.Name], property.PropertyType), 
null);
                        }
                        
catch (Exception ex)
                        {
                            err 
+= property.Name + " | " + ex.Message + "<br />";
              
                        }
                    }
                }
                
else
                {
                    
foreach (var Attribute in new RouteValueDictionary(otherAttributes))
                    {
                        
if (property.Name == Attribute.Key)
                        {
                            
try
                            {
                                objType.GetProperty(property.Name).SetValue(InObj, Attribute.Value, 
null);
                            }
                            
catch (Exception ex)
                            {
                                err 
+= property.Name + " | " + ex.Message + "<br />";
                        
                            }

                        }
                    }
                }
                
            }



            
return err;
        }

 

 

调用的时候,这样用:

 

string err = AutoSave(en, new { news_time = DateTime.Now, news_kind = _db.news_kind.First(m => m.nk_id == XXX) });

 

 

这样,需要特殊处理的字段就额外处理.剩下的一般的int的,string的都可以自动保存.

posted @ 2009-12-03 12:14 gxpotato 阅读(253) 评论(0) 编辑


2008年7月18日

由于对XML不熟,所以,还是老方法用递归实现。数据库的表:
sh_id int 4 0
sh_name varchar 500 1
sh_parent int 4 1
sh_number int 4 1

Code

nodesDataSet 是一个Session,保存了这张表的所有的节点信息。这个方法,只要知道这个节点,就能绑定它的子节点,以前还看到了有些人定义数据库表,还要节点的层数,我觉得很傻。。。

另外,我用来了哈希表来保存每个已经绑定了的节点。 一开始先添加一个value的值为0的根节点。然后正常的调用这个方法即可。

更深层次的东西:
从这个例子中可以看出,这个哈希表的其实是对象的引用而不是对象的复制。从哈希表中取出父节点并添加子节点可以看出。但是我一直很郁闷的就是,我如果直接对哈希表操作,让某个节点展开什么的。。。都不行。。

posted @ 2008-07-18 16:45 gxpotato 阅读(109) 评论(0) 编辑


2008年4月7日

最近做的东西很郁闷,当初新手的时候,没有对某些列表控件例如:DropDownList/ListBox/CheckBoxList等这些列表控件进行边界处理.测试的时候,都是有数据的,后来系统初始化,清理所有测试数据交给客户用的时候,就出现了空的DataSet绑定这些控件,而出现空值出错的问题...由于做的东西很多..方法都十几个,,如果一个一个修改的话..累死..还要重新测试一遍..翻阅了MSDN之后,发现了一个方法..老鸟肯定知道的..像我这样的菜鸟就需要了..

这些控件有个.Net 2.0之后添加的属性: AppendDataBoundItems 表示绑定的数据都在预设列表值之后追加.也就是说,我们设定一个默认值,避免出现因为DataSet空值绑定,返回空值而出现的边界问题.

<asp:DropDownList ID="teamList" runat="server" DataTextField="schtms_name" DataValueField="schtms_id" OnSelectedIndexChanged="teamList_SelectedIndexChanged" AutoPostBack="True" AppendDataBoundItems="true">
    <asp:ListItem Value="-1">暂无团队</asp:ListItem>
    </asp:DropDownList>


红色部分就是最加的内容.其他的控件同上.这样一来,绑定的数据都在"<asp:ListItem Value="-1">暂无团队</asp:ListItem>"后面,也就是说有个初始化的默认值,就不会因为返回空值而出错了.


我本以为这个问题就这样OK了.可是事情并不是照我想象的那样...因为我在测试的过程中发现了一件很奇怪的事情,就是这个属性会让数据重复绑定.出现重复的数值......这个时候我才明白,这个"AppendDataBoundItems",实际上就是一个绑定前,清不清空item数据的选项.

俗话说:1计不成,再生1计.我想了一下..绑定数据的时候,会自动清空DropDownList里面的items.肯定不能在绑定之前加这个默认选项了....整理了一下思路,方法有2:

1 绑定前给dataset添加一条数据.....这个方法太烂...因为要new一个row.
2 在DropDownList 绑定数据之后,insert一个默认选项出来.可以利用DropDownList的DataBound事件,这个事件是绑定之后处理的.
    protected void DropDownList1_DataBound(object sender, EventArgs e)
    {
        ListItem newLI = new ListItem("select all", "-1");
        DropDownList1.Items.Insert(0, newLI);
    }


这下..终于搞定这个默认值了,看样子这个"AppendDataBoundItems"不是那么好用的...虽然解决了默认值的问题..我发现..我还是要把项目中做过的DropDownList全部加一遍这个事件...我还是老老实实做人算了..

posted @ 2008-04-07 11:50 gxpotato 阅读(85) 评论(0) 编辑


2008年4月2日

昨天碰到一个问题.以前都没有注意到的问题.就是多线程浏览器,只要不关闭浏览器,每个标签不管你如何更换登录用户共用的都是一个Session,这个和Session产生的机制有关,具体的不多说了.主要的是,我们为什么会碰到问题,在系统的应用过程中,某个企业个人肯定存在一个人担当多个角色的问题,那么进行重复的登录就是平常的事情了,比如说:我用角色A,填表单,然后提交给角色B,然后我再登录角色B处理这个表单,然后提交回去给A.这个时候如果切换到刚才A的标签进行处理就发现实际上系统确定角色是B.

有些人说了他们的解决方案:1 重申新登录用户必须新开一个浏览器. 2 通过Session是否存在,禁止多用户同一浏览器重复登录..其实这些解决的方法都是下下策.方法1太麻烦,我们做系统,就要把客户想象成那种非常白纸,什么都没有的,非常懒的,不愿意多步操作的人一样.你不能指望客户和我们一样的有耐心. 方法2.在企业里面个人担当多个角色的情况肯定存在,多用户登录无法避免,我们总不能操作一个,就要登录一次.一个工作流下来的几个审批...你要登录多少次??.因此,我们需要一个解决的方法.

我个人推荐的方法是,把用户的ID带入页面级.具体的解决方法我觉得有:
1 通过URL传递用户ID.这个用户ID一直跟著用户操作的每个页面.我们取值的时候,可以通过Session["+Request["用户ID"].toString()+"]--来区分每个不同的Session.在页面处理的时候,通过URL传递的用户ID,来取不同的Session变量.
2 通过页面的隐藏的input来传递用户ID.同样可以通过Session["+Request["用户ID"].toString()+"]--来区分每个不同的Session.在页面处理的时候,通过URL传递的用户ID,来取不同的Session变量.
3 通过保存页面的状态视图来获取用户的ID.

有些人说,可以通过cookies来解决.我到现在还没想好cookies怎么解决这个问题.因为cookies的产生机制和Session一样的.cookies一样存在共用问题.你虽然可以读取所有的COOKIES,但是你不知道哪个cookies才是和当前页面所属操作人员对应.

最后,建议通过URL或者隐藏input来传递的变量,要进行加密,加强安全性.

posted @ 2008-04-02 20:55 gxpotato 阅读(619) 评论(0) 编辑


2008年4月1日

posted @ 2008-04-01 15:50 gxpotato 阅读(183) 评论(0) 编辑


posts - 6, comments - 0, trackbacks - 0, articles - 0

Copyright © gxpotato