到上篇为止我们已经实现了导航树(虽然大多是代码,不过总归是达到了目的,谁让我不太愿意打字呢)

好了,我们这是来看看另外一种类型的树,选择树。

这种类型的树用处很多,如组织结构人员选择,如复杂数据字典选择等 ,那么这种类型的树都应该具备什么样的特性了?

  1. 应该包含导航树的所有功能
  2. 要节点要多个checkbox
  3. 支持多选和单选
  4. 级联选择
  5. 异步加载子节点(如果导航数据太大的话可以可以使用,但是事实上导航树的数据一般多不到哪里去)
  6. 在客户端和服务器端获取选择的数据。

image

 

下篇我会就以上五个功能点来分别分析一下代码是如何实现的。 今天就到这里。。

下篇一个树控件的实现(5)选择树,多出一个Checkbox,指出多选和单选功能点的实现

posted @ 2008-08-20 20:46 假正经哥哥 阅读(11) | 评论 (0)编辑

当我们需要TextBox为只读时,我们需要把TextBox的ReadOnly属性设置成True,但是如果,我们前台通过JS给这个Textbox赋值之后,TextBox值的状态在PostBack之后没有保持住,举个场景吧:

如我们做一个查询,查询字段中有个条件是 用户 ,通过自定义一个选择页面,返回到查询页面,本身是只读的,但是希望在点查询回发之后把上次选中的值保持住,如果简单的设置ReadOnly属性那是达不到效果的

 

那么怎么办呢?简单

 

后台代码的Page_Load中 设置Attributes

this.tbUserID.Attributes.add("ReadOnly","true");

posted @ 2008-08-05 20:23 假正经哥哥 阅读(15) | 评论 (0)编辑
     摘要: 上两节 我已经完成了这个导航树的UI方面的代码和原型,接着我们就来封装了   那写一个Asp.net 的控件,首先要选择一个合适的基类继承,可以减少很多东西,比如设计时呈现,一些属性等了。当然你也可以从头开始 contorl --webcontrol   --htmlcontrol   我们选择label 来做基类,简单,够用 ,来看下这个TreeView的类... 阅读全文
posted @ 2008-07-21 10:21 假正经哥哥 阅读(71) | 评论 (0)编辑

如果你能够看到这篇文章,说明我已经成功了

然后我要上次一张图片595551790

 

成功的话那就太酷了。因为网页的发布真的是很不方便

posted @ 2008-07-19 00:42 假正经哥哥 阅读(23) | 评论 (0)编辑
上一篇,一个树控件的实现(1)UI的展现 我们已经看到一个树控件的样子,这节我们要看看如何来实现树控件的javascript 

其实一个导航树,需要的脚本非常有限,在以后写选择树的时候javascript 可能要复杂一点,好我们一切为了简单,从简单开始把

首先我们还是要对HTML做一些改动 ,其实改动非常少,就是要给Node的每个元素加上一个ID
注:代码的样式有点问题啊,注释的颜色 ,
我们来看一个Node把,基本上每个Node都要改,并且给一些图片加上了onmouseover,和onmouseout,onclick事件
 
     <!--我们来分析一个Node-->
          
<li>
          
<div id="tvAppSubMenu_1" ><!--div是node的容器,ID为=TreeViewID+NodeIndex-->
          
<!--每个元素都有NodeID延伸开的唯一表示如NodeID+"_cimg"->
          <img  id="tvAppSubMenu_1_cimg" src="/Images/TreeView/s.gif" class="bbit-tree-arrow bbit-tree-arrow-plus"/>
              <a  href="javascript:void(0)" onclick="javascript:TreeNode_Click($('tvAppSubMenu_1'),{id:'tvAppSubMenu_1',text:'菜单',value:'',url:'testpage.aspx',target:'',tooltip:''})>
              <img  onclick="javascript:OnTreeArrowClick(this,$('tvAppSubMenu_1_ul'),$('tvAppSubMenu_1_pimg'));" 
                onmouseout="javascript:OnTreeArrowMouseOut(this);" 
                onmouseover="javascript:OnTreeArrowMouseOver(this); class="bbit-tree-folder" src="/Images/TreeView/s.gif" />
              <span>菜单1</span>
              </a>
          </div>
          <!--这里是子节点
-->
           
<ul  id="tvAppSubMenu_1_ul">
            此处的内容省略
           
</ul>
          
</li>

好了Javascript 开始了其实需要写的函数非常之少
function $()
{  
    
var elements = new Array();
    
for (var i = 0; i < arguments.length; i++) {
        
var element = arguments[i];
        
if (typeof element == 'string')
            element 
= document.getElementById(element);
        
if (arguments.length == 1)
            
return element;
        elements.push(element);
    }
    
return elements;
}
function toggle(element)
{
    
if (!(element = $(element))) return;
    
if(element.style.display =="none")
    {
        element.style.display 
="";
    }
    
else
    {
       element.style.display 
="none";
    }    
}
function hasClassName(element,className)
{
    
if (!(element = $(element))) return;
    
var elementClassName = element.className;
    
return (elementClassName.length > 0 && (elementClassName == className ||
      
new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName)));
}
function addClassName(element, className) {
    
if (!(element = $(element))) return;
    
if (!hasClassName(element,className))
      element.className 
+= (element.className ? ' ' : ''+ className;
    
return element;
  }
function removeClassName(element, className) {
    
if (!(element = $(element))) return;
    element.className 
= element.className.replace(
      
new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ').strip();
    
return element;
  }

//+,-号的变化效果
function OnTreeArrowMouseOver(arrow)
{
    
if(hasClassName(arrow,"bbit-tree-arrow-plus"))
    {
        removeClassName(arrow,
"bbit-tree-arrow-plus");
        addClassName(arrow,
"bbit-tree-arrow-plus-over");
    }
    
if(hasClassName(arrow,"bbit-tree-arrow-minus"))
    {
        removeClassName(arrow,
"bbit-tree-arrow-minus");
        addClassName(arrow,
"bbit-tree-arrow-minus-over");
    }      
}
//+,-号的变化效果
function OnTreeArrowMouseOut(arrow)
{
    
if(hasClassName(arrow,"bbit-tree-arrow-plus-over"))
    {
        removeClassName(arrow,
"bbit-tree-arrow-plus-over");
        addClassName(arrow,
"bbit-tree-arrow-plus");
    }
    
if(hasClassName(arrow,"bbit-tree-arrow-minus-over"))
    {
        removeClassName(arrow,
"bbit-tree-arrow-minus-over");
        addClassName(arrow,
"bbit-tree-arrow-minus");
    }
}
//展开和收缩子元素
function OnTreeArrowClick(arrow,elobj,pimg)
{
     
if(hasClassName(arrow,"bbit-tree-arrow-plus-over"|| hasClassName(arrow,"bbit-tree-arrow-plus") )
    {
         removeClassName(arrow,
"bbit-tree-arrow-plus-over");
         removeClassName(arrow,
"bbit-tree-arrow-plus");
         addClassName(arrow,
"bbit-tree-arrow-minus");
   }
    
else if(hasClassName(arrow,"bbit-tree-arrow-minus-over"|| hasClassName(arrow,"bbit-tree-minus-plus"))
    {
         removeClassName(arrow,
"bbit-tree-arrow-minus-over");
         removeClassName(arrow,
"bbit-tree-arrow-minus");
         addClassName(arrow,
"bbit-tree-arrow-plus");
     }
    
if(hasClassName(pimg,"bbit-tree-folder"))
    {                      
        removeClassName(pimg,
"bbit-tree-folder");
        addClassName(pimg,
"bbit-tree-folderopen");
    }
    
else if(hasClassName(pimg,"bbit-tree-folderopen"))
    {
        removeClassName(pimg,
"bbit-tree-folderopen");
        addClassName(pimg,
"bbit-tree-folder");
    }
            toggle(elobj);;
    
}
function TreeNode_ExpandToggle(node)
{
    
var nodeul = $(node.id+"_ul");
    
var pimg = $(node.id+"_pimg");
    
if(nodeul !=null && pimg !=null)
    {
        OnTreeArrowClick(node.id
+"_cimg",nodeul,pimg);
    }
}   
//需要实现的函数,可以从arg中获取到说需要到节点的数据
//
,现有代码实现点击node如果包含子元素则展开/收缩子元素  
function TreeNode_Click(sender,arg)
{
    
if(sender.HasChilds =="true")
    {
      TreeNode_ExpandToggle(sender);
    }

好了定义了基本的函数,还有就是前面HTML 就需要用到onmouseover,onmouseout,TreeNode_Click 等
    其中的TreeNode_Click  需要实现,如需要获取Url直接打开,或者想获取value 做其他操作

至此导航树 的前台代码已经完毕了。下节我们一起来完成服务器代码的编写
预定
一个树控件的实现(3)编写一个ASP.Net 导航树TreeView
posted @ 2008-07-18 22:37 假正经哥哥 阅读(86) | 评论 (0)编辑

本来想说下为什么要写这篇随笔。但是当初的想法,现在忽然想不起来,只是知道好像要写这么一篇文字。
写完后会提供整个的源代码
第一步,我们要实现一个导航树
如图所示

以前用的树都是Table套Table的做法,那么既然新写换个做法吧UL 套Ul 。
先来看下HTMl的标记原型把。下如

 1       <ul>
 2        <li>菜单1</li>
 3         <li>菜单2
 4              <ul>
 5                <li>子菜单1</li>
 6                 <li>子菜单2</li>
 7                  <li>子菜单3</li>
 8                   <li>子菜单4</li>
 9              </ul>
10         </li>
11          <li>菜单3</li>
12           <li>菜单4
13              <ul>
14                  <li>子菜单1</li>
15                   <li>子菜单2</li>
16                   <li>子菜单3
17                        <ul>
18                          <li>子子菜单1</li>
19                           <li>子子菜单2</li>
20                           <li>子子菜单3</li>
21                           <li>子子菜单4</li>
22                        </ul>
23                   </li>
24                   <li>子菜单4</li>
25                </ul>
26           </li>     
27      </ul>

上面的HTML如果不做任何处理,那么它的样子是这样的


其实有点树状结构的样子了,那么达到我们的目的那应该不复杂哟
那么我们开始了 ,第一步,去除li旁边的点,去掉点之后原来的缩进发现缩进没理,所以要把缩进继续加上去

    .TreeView ul
    
{
        margin
: 0px;
        padding
: 0px;
        
/*不显示边框*/
        border
: none; 
        line-height
:20px; 
        list-style-type
:none;
    
}
    .TreeView ul li
    
{
        margin
: 0px;
        font-size
:12px;
        white-space
: nowrap;     
    
}
   .TreeView ul li ul
    
{
        margin-left
:10px;
    
}
上面的用UL用class = TreeView Div包起来
<div class="TreeView">
</div>

接着我们要把图标加上去 。
需要以下几个图标
    
好了继续写样式,定义了图标的样式,和另外一些元素的定义
  .TreeView
        
{
            font-size
:12px;
            padding-left
:10px;  
            color
:#0F243E;    
        
}       
        .TreeView a,.TreeView a:visited
        
{
            text-decoration
:none;
            color
:#0F243E;    
        
}
        .TreeView ul
        
{
            margin
: 0px;
            padding
: 0px;
            
/*不显示边框*/
            border
: none; 
            line-height
:20px; 
            list-style-type
:none;
        
}
        .TreeView ul li
        
{
            margin
: 0px;
            font-size
:0px;
            white-space
: nowrap;     
        
}
        .TreeView ul li div
        
{
            height
:21px;
        
}
        .TreeView ul li a
        
{           
            display
:inline; 
            height
:20px;
            font-size
:12px;        
            padding-right
:4px;    
            vertical-align
:top;
            padding-left
:1px;
        
}
        .TreeView ul li a span
        
{
            margin-left
:4px;
            margin-bottom
:2px;
        
}
        .TreeView ul li a:hover
        
{
            background
:url("/images/TreeView/nodeover.gif") repeat-x left top;
            border-left
:solid 1px #B5E6F4;
            border-right
:solid 1px #B5E6F4;
            border-top
:none;
            border-bottom
:none;
            padding-left
:0px;
            padding-right
:3px;        
        
}
        .TreeView ul li ul
        
{
            margin-left
:10px;
        
}
        .TreeView img
        
{
            width
:16px;
            height
:18px;
            vertical-align
:middle;
            border
:none;
        
}
        .TreeView img.bbit-tree-folder
        
{
            background
:url("/images/TreeView/folder.gif") no-repeat left 1px;
        
}
         .TreeView img.bbit-tree-folderopen
        
{
            background
:url("/images/TreeView/folder-open.gif") no-repeat left 1px;
        
}
        .TreeView img.bbit-tree-file
        
{
            background
:url("/images/TreeView/leaf.gif") no-repeat left 1px;  
        
}
        .TreeView img.bbit-tree-arrow
        
{
          cursor
:pointer;
          background
:url("/images/TreeView/arrows.gif") no-repeat;
        
}
        .TreeView img.bbit-tree-arrow-plus
        
{
         background-position
:2px 2px;  
        
}
        .TreeView img.bbit-tree-arrow-plus-over
        
{
         background-position
:-30px 2px;
        
}
        .TreeView img.bbit-tree-arrow-minus
        
{
         background-position
:-14px 2px;
        
}
        .TreeView img.bbit-tree-arrow-minus-over
        
{
             background-position
:-46px 2px;
        
}


然后我们必须把开始的HTML改成如下
 <div class="TreeView">
        <ul>
          <li><div><img src="/Images/TreeView/s.gif" class="bbit-tree-arrow bbit-tree-arrow-plus"/><a  href="javascript:void(0)"><img class="bbit-tree-folder" src="/Images/TreeView/s.gif" /><span>菜单1</span></a></div></li>
         <li><div><img src="/Images/TreeView/s.gif" class="bbit-tree-arrow bbit-tree-arrow-minus" /><a  href="javascript:void(0)"><img class="bbit-tree-folderopen" src="/Images/TreeView/s.gif" /><span>菜单2</span></a></div>
              <ul>
                <li><div><img src="/Images/TreeView/s.gif" /><a  href="javascript:void(0)"><img class="bbit-tree-file" src="/Images/TreeView/s.gif" /><span>子菜单1</span></a></div></li>
                 <li><div><img src="/Images/TreeView/s.gif" /><a  href="javascript:void(0)"><img class="bbit-tree-file" src="/Images/TreeView/s.gif" /><span>子菜单2</span></a></div</li>
                  <li><div><img src="/Images/TreeView/s.gif" /><a  href="javascript:void(0)"><img class="bbit-tree-file" src="/Images/TreeView/s.gif" /><span>子菜单3</span></a></div</li>
                   <li><div><img src="/Images/TreeView/s.gif" /><a  href="javascript:void(0)"><img class="bbit-tree-file" src="/Images/TreeView/s.gif" /><span>子菜单4</span></a></div</li>
              </ul>
         </li>
           <li><div><img src="/Images/TreeView/s.gif" class="bbit-tree-arrow bbit-tree-arrow-plus"/><a  href="javascript:void(0)"><img class="bbit-tree-folder" src="/Images/TreeView/s.gif" /><span>菜单1</span></a></div></li>
         <li><div><img src="/Images/TreeView/s.gif" class="bbit-tree-arrow bbit-tree-arrow-minus" /><a  href="javascript:void(0)"><img class="bbit-tree-folderopen" src="/Images/TreeView/s.gif" /><span>菜单2</span></a></div>
              <ul>
                <li><div><img src="/Images/TreeView/s.gif" /><a  href="javascript:void(0)"><img class="bbit-tree-file" src="/Images/TreeView/s.gif" /><span>子菜单1</span></a></div></li>
                 <li><div><img src="/Images/TreeView/s.gif" /><a  href="javascript:void(0)"><img class="bbit-tree-file" src="/Images/TreeView/s.gif" /><span>子菜单2</span></a></div</li>
                  <li><div><img src="/Images/TreeView/s.gif" /><a  href="javascript:void(0)"><img class="bbit-tree-file" src="/Images/TreeView/s.gif" /><span>子菜单3</span></a></div</li>
                   <li><div><img src="/Images/TreeView/s.gif" /><a  href="javascript:void(0)"><img class="bbit-tree-file" src="/Images/TreeView/s.gif" /><span>子菜单4</span></a></div</li>
              </ul>
         </li>
      </ul>
        
    </div>

看上去比较乱,我们来分析一下 我们一个Node为一个单位的话,那么那些HTMl代表一个Node呢?对的一个LI
<li><div><img src="/Images/TreeView/s.gif" class="bbit-tree-arrow bbit-tree-arrow-plus"/><a  href="javascript:void(0)"><img class="bbit-tree-folder" src="/Images/TreeView/s.gif" /><span>菜单1</span></a></div></li>
<div>包起来li的内容,主要是为了控制LI内的内容宽度和高度的限制
接着下来的第一个Img ,s.gif 是个占位符号, 用于显示+,- 号,如过没有+,-那么就不要附上其他样式,那么用户就看不到了。
如果需要加减号的话只要附上 样式bbit-tree-arrow bbit-tree-arrow-plus 就标识这要显示一个加号
<a> 标签主要为了以后附加onclick,treenodemouseover,treenodemouseout 事件 比较方便 。下面会讲到
<img> 接着的一个img,是node的icon,如果不要那么只要设置img的样式display:none即可,同样s.gif是占位符,bbit-tree-folder那么就显示一个文件夹图标
<span>抱着nodeText 可以更好的控制NodeText的样式 。

看看效果

看吧样子已经差不多了,UI的原型已经实现,接着 下 我们来开始编写这个树的JS了。

下篇 :一个树控件的实现(2)树控件的Javascript实现
posted @ 2008-07-18 21:52 假正经哥哥 阅读(58) | 评论 (0)编辑

While in development, the friendly error page that SharePoint displays when your page has an error can make debugging your master page issues very difficult. You can make an easy change to your Web config file for the site to turn friendly error messages off, therefore providing you with more useful information if your page breaks. Only do the following in a development environment, you would never want to turn off friendly error messages in a production environment. Also be sure to make a back up of the file prior to editing.

  1. On the Web server, navigate to the site directory:
    Local Drive:\Inetpub\wwwroot\wss\VirtualDirectories\[directory for site] (for example 84)
  2. Open Web.config in Notepad.
  3. Search for "CallStack". Change the CallStack status to "true".
    <SafeMode MaxControls="200" CallStack="true" DirectFileDependencies="10" TotalFileDependencies="50" AllowPageLevelTrace="false">
  4. Search for "CustomErrors". Change the mode to "off".
    <customErrors mode="Off" />
  5. Save and close the file.
Now when your site encounters an error, you will receive a .NET screen outlining the issue instead of the friendly SharePoint error screen. This is particularly useful with dealing with missing Content Placeholders and editing Master Pages. To turn friendly error messages back on, just walk through these steps setting the CallStack to false and CustomErrors mode to On.

来自下面的:http://www.heathersolomon.com/blog/articles/BaseMasterPages.aspx
posted @ 2008-06-14 10:01 假正经哥哥 阅读(36) | 评论 (0)编辑
在2003版本中,获取邮箱已使用的空间是通过webdav循环所有的文件夹获取所有的文件夹的邮件的大小之和。消耗资源较大。。
在2007版中,我们通过webservice获取所有的文件夹,根据文件夹的信息来累计文件夹已使用大小。 但是消耗资源也较大,每次在第一次访问的时候大概在3s左右。那么有没有更好更快的办法呢 ?

当然是有的,首先考虑的问题,那么owa自己是怎么做呢,他自己有没有获取这些数据呢?


既然它可以取到?那么我们自然也可以通过它的方式取到罗?
测试开始。。。
用fiddler2 监控一下 ,发现了以下可疑的链接?



进一步查看:

看上图的文字?对了这就是我们要的数据了,就是这个请求了。。
前面一个数字是byte数,后面是显示的文字,转换成了kb,当大于1mb时就转换成mb

那接下来的事就比较简单了。就是如何来构建这个请求了。我们来仔细看下这个请求。见下图


上图可知,请求只post方式:

url地址为:http://mail.lab.com/owa/ev.owa?oeh=1&ns=Tree&ev=GetMailboxUsage

其中http://mail.lab.com/owa owa的根路径

需要下列的文件头:

Accept: */*
Accept-Language: zh-cn
Referer: http://mail.lab.com/owa/
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.04506; .NET CLR 3.5.21022)
Host: mail.lab.com
Content-Length: 9
Connection: Keep-Alive
Pragma: no-cache
Cookie: UserContext=5148366543cf495697cfa3dcb434d772
Authorization: Basic bGFiXHN5czpBcHAxMjM0

删除没必要的文件头(一个一个删除来测试是否必要)

User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.04506; .NET CLR 3.5.21022)
Host: mail.lab.com
Content-Length: 9
Authorization: Basic bGFiXHN5czpBcHAxMjM0  

其中:Authorization为变量,即当前用户的登录信息

请求的body
<params/>

好了知道了这些就好办了,
通过httpResponse,和httpRequest来构建这个请求吧
以下是详细代码:
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Text.RegularExpressions;
using System.IO;

namespace Beyondbit.Components.Exchange
{
    
public class UseAgeHelp
    {
        
public UseAgeHelp(string account, string password, string domain)
        {
            _account 
= account;
            _password 
= password;
            _domain 
= domain;
        }

        
private string _account = "";
        
private string _password = "";
        
private string _domain = "";

        
        
private string GetMailboxUsageString()
        {
            
string url = Config.ExchangeServerPath + "ev.owa?oeh=1&ns=Tree&ev=GetMailboxUsage";
            WebResponse ret 
= HttpCallGetMailboxUsage(url);
            Stream stream 
= ret.GetResponseStream();
            StreamReader sr 
= new StreamReader(stream, Encoding.GetEncoding("UTF-8"));
            
string htmlstr = sr.ReadToEnd();
            
return htmlstr;
        }

        
/// <summary>
        
/// 获取用户已经使用的容量
        
/// </summary>
        
/// <returns>返回已使用容量的byte数 /1024 单位为kb  再/1024 单位为 MB</returns>
        public int GetMailboxUsage()
        {
            
string usageString = GetMailboxUsageString();
            Match mc 
= Regex.Match(usageString, @"^<div id=mbUsg>([\d]+)</div><div id=dspMbUsg>([\d|\w|\W]+)</div>$");
            
return Convert.ToInt32(mc.Groups[1].Value);
        }
        
/// <summary>
        
/// 获取用户已经使用的容量
        
/// </summary>
        
/// <returns>返回已使用容量的原始文本</returns>
        public string GetMailboxUsageSourceString()
        {
            
string usageString = GetMailboxUsageString();
            Match mc 
= Regex.Match(usageString, @"^<div id=mbUsg>([\d]+)</div><div id=dspMbUsg>([\d|\w|\W]+)</div>$");
            
return mc.Groups[0].Value;
        }

        
/// <summary>
        
/// 获取用户已经使用的容量
        
/// </summary>
        
/// <returns>返回已使用容量的显示文本</returns>
        public string GetMailboxUsageDisplayString()
        {
            
string usageString = GetMailboxUsageString();
            Match mc 
= Regex.Match(usageString, @"^<div id=mbUsg>([\d]+)</div><div id=dspMbUsg>([\d|\w|\W]+)</div>$");
            
return mc.Groups[2].Value;
        }

        
private WebResponse HttpCallGetMailboxUsage(string url)
        {
            HttpWebRequest Req;

            
try
            {
                
//构建当前用户的凭据 ,以下两行
                System.Net.CredentialCache MyCredentialCache = new System.Net.CredentialCache();
                MyCredentialCache.Add(
new Uri(url), "basic"new System.Net.NetworkCredential(_account, _password, _domain));

                
//生成一个请求类
                Req = (System.Net.HttpWebRequest)HttpWebRequest.Create(url);
                
//把当前凭据设置成已经建立好的凭据
                Req.Credentials = MyCredentialCache;
                
//设置请求的方式为POST
                Req.Method = "POST";
                
//该项可有可无
                Req.ContentType = "application/x-www-form-urlencoded";
                Req.AllowAutoRedirect 
= true;
                
//用户客户端类型,我们把它设置成IE
                Req.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.04506; .NET CLR 3.5.21022)";

                
//构建请求的消息体body
                byte[] paraStream = Encoding.UTF8.GetBytes("<params/>");//写死body的内容
                Req.ContentLength = paraStream.Length;
                Stream newStream 
= Req.GetRequestStream();
                newStream.Write(paraStream, 
0, paraStream.Length);
                newStream.Close();
                
//Stream request =Req.GetRequestStream();
                
//request.Write(

            }
            
catch (Exception ex)
            {
                
throw ex;
            }

            
try
            {
                
//发起请求,并返回Response的对象
                WebResponse result = Req.GetResponse();

                
return result;

            }
            
catch (Exception ex)
            {

                
throw ex;
            }
        }
    }
}


posted @ 2008-06-02 21:02 假正经哥哥 阅读(72) | 评论 (0)编辑
AD中有存放照片的字段吗?
答案肯定是有的、photo,jpegPhoto,thumbnailPhoto

前端时间客户,包括领导 在问通讯录中的照片为什么存在数据库中而不是AD中,AD中的属性能不能利用起来呢?
我想照片这么大的数据,如果用户量大的,应该是不建议存放在AD端的,不然为什么微软的ad管理器都没有照片的管理项呢?

但是既然领导问了,当然要去验证一下。。

 1   
 2 //获取需要修改的用户对象实体
 3 private DirectoryEntry getDirectoryEntryBy(string samAccountName)
 4         { 
 5             string path="LDAP://pcdc01.company.com/OU=上海XX软件有限公司,dc=company,dc=com";
 6             DirectoryEntry rootde = new DirectoryEntry(path, "userid""pwd"); //访问用户
 7             DirectorySearcher ds = new DirectorySearcher(rootde);
 8             ds.SearchScope = SearchScope.Subtree;
 9             ds.Filter = "(&(&(objectCategory=person)(objectClass=user))(sAMAccountName=" + samAccountName + "))";
10             SearchResult sr = ds.FindOne();
11             if (sr != null)
12             {
13                return sr.GetDirectoryEntry();
14             }
15             else 
16             {
17                 return null;
18             }
19         }

 1 //以下代码是从AD中取图片 
 2 
 3 string account = this.tbAccount.Text;
 4             if ( account == "" )
 5             {
 6                 MessageBox.Show("请填写帐号");
 7                 return;
 8             }
 9             DirectoryEntry de = getDirectoryEntryBy(account);
10             if (de == null)
11             {
12                 MessageBox.Show("帐号无效");
13                 return;
14             }
15             string photocol = this.cbbPhotoCol.Text; //那个字段存取照片,三个中选一个
16             
17             System.DirectoryServices.PropertyValueCollection pvc = de.Properties[photocol];
18             if (pvc.Value != null && pvc.Value is byte[])
19             {
20                 byte[] by = (byte[])pvc.Value;
21                 MemoryStream Stream = new MemoryStream(by);
22                 this.pbcontainer.Image = Image.FromStream(Stream);
23             }
24             else
25             {
26                 MessageBox.Show("False");
27             }


 1 
 2将照片存到AD中
 3
 4<