我需要在c#中以编程方式将自定义菜单操作添加到自定义内容类型。这是因为我不知道我需要事先链接到的URL。激活该功能时,将从配置中拉出要链接的URL。 我尝试过以下方法:
在我的Element.xml文件中添加了CustomAction:
<CustomAction
Id="MyID"
RegistrationType="ContentType"
RegistrationId="0x010100ef19b15f43e64355b39431399657766e"
Location="EditControlBlock"
Sequence="1000"
Title="My Menu Item">
<UrlAction Url="" />
</CustomAction>
在我的功能接收器FeatureActivated方法中,我有:
SPElementDefinitionCollection eleCollection =
properties.Feature.Definition.GetElementDefinitions(
new System.Globalization.CultureInfo(1));
foreach (SPElementDefinition ele in eleCollection)
{
if (ele.Id == "MyID")
{
System.Xml.XmlNode node = ele.XmlDefinition.FirstChild;
node.Attributes[0].Value = "MY URL";
ele.FeatureDefinition.Update(true);
}
}
我希望此代码使用“我的网址”更新UrlAction网址,但事实并非如此。如果我在XML中硬编码URL它可以工作,但我必须能够以编程方式进行。
答案 0 :(得分:7)
您可以在SPWeb对象上使用SPUserCustomActionCollection:
using (SPSite site = new SPSite("http://moss.dev.com"))
using (SPWeb web = site.OpenWeb())
{
SPContentType contentType = web.ContentTypes["Curriculum Vitae"];
SPUserCustomAction action = web.UserCustomActions.Add();
action.RegistrationType = SPUserCustomActionRegistrationType.ContentType;
action.RegistrationId = contentType.Id.ToString();
action.Location = "EditControlBlock";
action.Sequence = 450;
action.Title = "Test";
action.Rights = SPBasePermissions.EditListItems;
action.Url = "http://www.google.com";
action.Update();
}
这样,您可以将URL设置为您想要的任何内容。如果要更新现有的自定义操作,则可以遍历该集合并更新要查找的集合。安装自定义操作后更新元素XML定义不会执行任何操作。
答案 1 :(得分:2)
根据您想要实现的目标,您可以使用一些javascript;
<UrlAction Url="JavaScript:window.location='{SiteUrl}/_layouts/CustomListAction.aspx?ID={ListId}'"/>
~site和~siteCollection也有效:
<UrlAction Url="~site/_layouts/Page.aspx?ID={ListId}"/>
答案 2 :(得分:1)
我认为WSS架构定义不允许在UrlAction元素中使用空的Url属性。也许尝试在稍后覆盖的xml中放置一个“默认”url?