如何管理Sharepoint列表中基于列的访问控制?
我正在制作基于Sharepoint的问题跟踪门户。用户应该能够添加条目,但在条目本身中,我希望只有一列对特定的用户组(管理员)可见。有没有办法设置基于列的访问控制?据我所知,这在标准平台上是不可用的。另一方面,你能做的是手工制作你自己的现场控制如何管理Sharepoint列表中基于列的访问控制?,sharepoint,Sharepoint,我正在制作基于Sharepoint的问题跟踪门户。用户应该能够添加条目,但在条目本身中,我希望只有一列对特定的用户组(管理员)可见。有没有办法设置基于列的访问控制?据我所知,这在标准平台上是不可用的。另一方面,你能做的是手工制作你自己的现场控制 public class MyInteger: SPFieldNumber { public MyInteger(SPFieldCollection fields, string fieldName) : base(fields,
public class MyInteger: SPFieldNumber
{
public MyInteger(SPFieldCollection fields, string fieldName)
: base(fields, fieldName)
{
}
public MyInteger(SPFieldCollection fields, string typeName, string displayName)
: base(fields, typeName, displayName)
{
}
public override BaseFieldControl FieldRenderingControl
{
[SharePointPermission(SecurityAction.LinkDemand, ObjectModel = true)]
get
{
Microsoft.SharePoint.WebControls.BaseFieldControl ctl =
new MyIntegerControl();
ctl.FieldName = InternalName;
return ctl;
}
}
}
所以在customfieldtypes.xml中
<FieldTypes>
<FieldType>
<Field Name="TypeName">MyInteger</Field>
<Field Name="ParentType">Integer</Field>
...
<Field Name="FieldTypeClass">xxx</Field>
</FieldType>
在MyIntegerControl中,您可以做任何您想做的事情(大量重写),但一个例子是:
protected override void CreateChildControls()
{
base.CreateChildControls();
if (this.ControlMode == SPControlMode.New ||
this.ControlMode == SPControlMode.Display)
{
// check that use is admin and display value
}
}
您还可以通过注册一个CustomAction并动态更改列表视图模式来实现这一点
<CustomAction Id="CustomAction"
GroupId="SiteActions"
Location="Microsoft.SharePoint.StandardMenu"
Sequence="1003"
ControlAssembly="$SharePoint.Project.AssemblyFullName$"
ControlClass="CustomAction.ColumnPermissionAction"/>
在你的控制课上:
class ColumnPermissionAction : Control
{
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
HideColumn();
}
private HideColumn(){
WebPart part=//find your web part
string colName="SecretColumn";
if(part is ListViewWebPart){
(part as ListViewWebPart).ListViewXml = (part as ListViewWebPart).ListViewXml.Replace(string.Format("<FieldRef Name=\"{0}\"/>", colName), string.Empty);
}else if(part is XsltListViewWebPart){
PropertyInfo property = typeof(DataFormWebPart).GetProperty("ListViewXmlDom", BindingFlags.NonPublic | BindingFlags.Instance);
if (property != null)
{
XmlNode xmlView = property.GetValue(part as XsltListViewWebPart, null) as XmlNode;
if (xmlView != null)
{
XmlNode node = xmlView.SelectSingleNode("//ViewFields");
if (node != null)
{
var field = node.SelectSingleNode(string.Format("FieldRef[@Name='{0}']", colName));
if (field != null)
{
node.RemoveChild(field);
}
}
}
}
}
}
}
class ColumnPermissionAction:控件
{
受保护的覆盖无效加载(事件参数e)
{
基础荷载(e);
HideColumn();
}
私人HideColumn(){
web部件=//查找您的web部件
字符串colName=“SecretColumn”;
如果(部件为ListViewWebPart){
(部分作为ListViewWebPart.ListViewXml=(部分作为ListViewWebPart.ListViewXml.Replace(string.Format(“,colName)),string.Empty);
}else if(部分为XsltListViewWebPart){
PropertyInfo property=typeof(DataFormWebPart).GetProperty(“ListViewXmlDom”,BindingFlags.NonPublic | BindingFlags.Instance);
if(属性!=null)
{
XmlNode xmlView=property.GetValue(部分为XsltListViewWebPart,null)作为XmlNode;
if(xmlView!=null)
{
XmlNode=xmlView.SelectSingleNode(//ViewFields);
如果(节点!=null)
{
var field=node.SelectSingleNode(string.Format(“FieldRef[@Name='{0}']”,colName));
如果(字段!=null)
{
node.RemoveChild(字段);
}
}
}
}
}
}
}
我同意自定义字段是一个不错的选择。很好的例子!我也是,而且很好地展示了这个例子!
class ColumnPermissionAction : Control
{
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
HideColumn();
}
private HideColumn(){
WebPart part=//find your web part
string colName="SecretColumn";
if(part is ListViewWebPart){
(part as ListViewWebPart).ListViewXml = (part as ListViewWebPart).ListViewXml.Replace(string.Format("<FieldRef Name=\"{0}\"/>", colName), string.Empty);
}else if(part is XsltListViewWebPart){
PropertyInfo property = typeof(DataFormWebPart).GetProperty("ListViewXmlDom", BindingFlags.NonPublic | BindingFlags.Instance);
if (property != null)
{
XmlNode xmlView = property.GetValue(part as XsltListViewWebPart, null) as XmlNode;
if (xmlView != null)
{
XmlNode node = xmlView.SelectSingleNode("//ViewFields");
if (node != null)
{
var field = node.SelectSingleNode(string.Format("FieldRef[@Name='{0}']", colName));
if (field != null)
{
node.RemoveChild(field);
}
}
}
}
}
}
}