zoukankan      html  css  js  c++  java
  • SharePoint对象模式获取“用户或用户组”栏的值

    SharePoint的People Picker控件真的是非常好用的一个东东。
    但是,如果您需要输出某一个“用户或用户组”栏的值时,就显得有点麻烦了。
    如果您采用item["***"].ToString()这样的形式的话,输出的每一个人或组的信息前都有N#这样的符号。
    很显然,很多时候采用这种方式时,我们不得不对字符串进行分析并截取。
    “用户或用户组”类型的在对象模型中,有其对应的类型: SPFieldUser,通过它,我们就可以获取到某一个
    用户或用户组栏的对象模型了,如:SPFieldUser uField=item["***"] as SPFieldUser;
    “用户或用户组”中,您可以输入用户,也可以输入用户组
    “用户或用户组”类型栏的值的获取实际上是通过SPFieldUserValueCollection和SPFieldUserValue来获取的,
    而SPFieldUserValue指的是某一个人或某一个组。
    SPFieldUserValueCollection的获取方法 :

    SPFieldUserValueCollection users=item["栏名"] as SPFieldUser

    ValueCollection.   那获取SPFieldUserValue呢? 当然,您可以通过users的迭代来获取,但是,某种情况下,这种方法行不通:当你没有启用“用户或用户组”这一栏“允许多重选择”时,通过上述方法获取的users将为null,可能你会有如下的方法来获取

    SPFieldUserValue user=item["栏名"] as SPFieldUserValue

    唉,我也通过这种方法来获取,但是非常遗憾的是,系统友好的提示我:此路不通!

    牢骚:为什么在“允许多重选择”的情况下,通过SPFieldUserValueCollection users=item["栏名"] as SPFieldUserValueCollection就可以,而没启用的情况下用SPSPFieldUserValue user=item["栏名"] as SPFieldUserValue就行不通呢?这二个用法在针对是否启用“允许多重选择”下,是合情合理的啊?不管你怎么想,它就是行不通。
    实际上,在没有“允许多重选择”的情况下,您得通过SPFieldUserValue的构造函数来初始化一个对象,如:

    SPFieldUserValue usere = new SPFieldUserValue(web, item["栏目名"].ToString());

    够折腾人的吧?

    获得了SPFieldUserValueCollection和SPFieldUserValue对象后,该如何获取它里面的用户或用户组呢?
    获取用户:使用SPFieldUserValue的User属性。
    获取用户组:当SPFieldUserValue的User属性为null的时候,通过web.SiteGroups.GetByID(SPFieldUserValue.LookupID)来获取用户组。

    一波三折后,无论是获取用户或用户组(包括获取用户组里的用户)应该就是手到擒来了。

    附上一段从栏中获取用户的代码《没有作相关的异常或性能优化处理》:

    public List<SPUser> GetUsersFromSPFieldUser(SPListItem item)
    {
      List<SPUser> fUsers=new List<SPUser>();
      SPWeb web = item.ParentList.ParentWeb;
      SPFieldUser uField=item.Fields["作者"] as SPFieldUser;
      if(!uField.AllowMultipleValues) //允许多重选择
      {
         SPFieldUserValue userValue = new SPFieldUserValue(web, item["作者"].ToString());
         fUsers.Add(userValue.User);
      }
      else
      {
        SPFieldUserValueCollection userValues=item["作者"] as SPFieldUserValueCollection;
        foreach(SPFieldUserValue userValue in userValues)
        {
           if(null!=userValue.User)
           {
              fUsers.Add(userValue.User);
           }
           else
           {
              SPGroup userGroup=web.SiteGroups.GetByID(userValue.LookupID);
              fUsers.AddRange(userGroup.Users);
           }
        }
      }
      return fUsers;
    }
  • 相关阅读:
    Centos7 下 PHP 添加缺少的组件 sockets 和 openssl
    vue使用 video.js动态切换视频源视频源不刷新问题
    vue+js清除定时器
    获取ip地址,并根据ip获取当前省份
    html页面引用video.js播放m3u8格式视频
    uniapp每隔几秒执行一下网络请求(h5端亲测可以,其他端未测试)
    关于uniapp获取当前距离屏幕顶部的距离
    按值传递与按值引用详解(java版)
    JavaScript的深入理解(1)
    vue-cli3配置webpack-bundle-analyzer插件
  • 原文地址:https://www.cnblogs.com/masahiro/p/10128933.html
Copyright © 2011-2022 走看看