Tutorial: Crear un elemento de proyecto de acción personalizado con una plantilla de elementos, parte 2Walkthrough: Create a custom action project item with an item template, part 2

Después de definir un tipo de elemento de proyecto de SharePoint personalizado y asociarla a una plantilla de elementos en Visual Studio, también puede proporcionar a un Asistente para la plantilla.After you define a custom type of SharePoint project item and associate it with an item template in Visual Studio, you might also want to provide a wizard for the template. Puede usar al Asistente para recopilar información de los usuarios cuando usan la plantilla para agregar una nueva instancia del elemento de proyecto a un proyecto.You can use the wizard to collect information from users when they use your template to add a new instance of the project item to a project. La información que recopile puede usarse para inicializar el elemento de proyecto.The information that you collect can be used to initialize the project item.

En este tutorial, agregará un Asistente para el elemento de proyecto acción personalizada que se muestra en Tutorial: crear un elemento de proyecto de acción personalizado con una plantilla de elementos, parte 1.In this walkthrough, you will add a wizard to the Custom Action project item that is demonstrated in Walkthrough: Create a custom action project item with an item template, Part 1. Cuando un usuario agrega un elemento de proyecto acción personalizada para un proyecto de SharePoint, el asistente recopila información acerca de la acción personalizada (por ejemplo, su ubicación y la dirección URL de destino cuando un usuario final elige) y agrega esta información para el Elements.xml archivo en el nuevo elemento de proyecto.When a user adds a Custom Action project item to a SharePoint project, the wizard collects information about the custom action (such as its location and the URL to navigate to when an end user chooses it) and adds this information to the Elements.xml file in the new project item.

En este tutorial se muestran las siguientes tareas:This walkthrough demonstrates the following tasks:

  • Crear a un Asistente para un tipo de elemento de proyecto de SharePoint personalizado que está asociado con una plantilla de elemento.Creating a wizard for a custom SharePoint project item type that is associated with an item template.

  • Definir un interfaz de usuario que es similar a los asistentes integrados para los elementos de proyecto de SharePoint en Visual Studio de asistente personalizada.Defining a custom wizard UI that resembles the built-in wizards for SharePoint project items in Visual Studio.

  • Usar parámetros reemplazables para inicializar los archivos de proyecto de SharePoint con los datos recopilados en el asistente.Using replaceable parameters to initialize SharePoint project files with data that you collect in the wizard.

  • Depurar y probar el asistente.Debugging and testing the wizard.

Nota

Puede descargar una muestra de Github que muestra cómo crear actividades personalizadas para un flujo de trabajo.You can download a sample from Github that shows how to create custom activities for a workflow.

Requisitos previosPrerequisites

Para llevar a cabo este tutorial, primero debe crear la solución CustomActionProjectItem completando Tutorial: crear un elemento de proyecto de acción personalizado con una plantilla de elementos, parte 1.To perform this walkthrough, you must first create the CustomActionProjectItem solution by completing Walkthrough: Create a custom action project item with an item template, Part 1.

También necesitará los siguientes componentes en el equipo de desarrollo para completar este tutorial:You also need the following components on the development computer to complete this walkthrough:

Crear el proyecto de AsistenteCreate the wizard project

Para completar este tutorial, debe agregar un proyecto a la solución CustomActionProjectItem que creó en Tutorial: crear un elemento de proyecto de acción personalizado con una plantilla de elementos, parte 1.To complete this walkthrough, you must add a project to the CustomActionProjectItem solution that you created in Walkthrough: Create a custom action project item with an item template, Part 1. Implementará la interfaz IWizard y definirá la interfaz de usuario del asistente de este proyecto.You will implement the IWizard interface and define the wizard UI in this project.

Para crear el proyecto de AsistenteTo create the wizard project

  1. En Visual Studio, abra la solución CustomActionProjectItemIn Visual Studio, open the CustomActionProjectItem solution

  2. En el Explorador de soluciones, abra el menú contextual del nodo de solución, elija agregary, a continuación, elija nuevo proyecto.In Solution Explorer, open the shortcut menu for the solution node, choose Add, and then choose New Project.

  3. En el nuevo proyecto cuadro de diálogo, expanda el Visual C# o Visual Basic nodos y, a continuación, elija el Windows nodo.In the New Project dialog box, expand the Visual C# or Visual Basic nodes, and then choose the Windows node.

  4. En la parte superior de la nuevo proyecto diálogo cuadro, asegúrese de que .NET Framework 4.5 se elige en la lista de versiones de .NET Framework.At the top of the New Project dialog box, make sure that .NET Framework 4.5 is chosen in the list of versions of the .NET Framework.

  5. Elija la biblioteca de controles de usuario de WPF plantilla de proyecto, asigne al proyecto ItemTemplateWizardy, a continuación, elija el Aceptar botón.Choose the WPF User Control Library project template, name the project ItemTemplateWizard, and then choose the OK button.

    Visual StudioVisual Studio Agrega el ItemTemplateWizard proyecto a la solución. adds the ItemTemplateWizard project to the solution.

  6. Elimine el elemento UserControl1 del proyecto.Delete the UserControl1 item from the project.

Configurar el proyecto de AsistenteConfigure the wizard project

Antes de crear al asistente, debe agregar una ventana de Windows Presentation Foundation (WPF), un archivo de código y referencias de ensamblado al proyecto.Before you create the wizard, you must add a Windows Presentation Foundation (WPF) window, a code file, and assembly references to the project.

Para configurar el proyecto de asistenteTo configure the wizard project

  1. En el Explorador de soluciones, abra el menú contextual de la ItemTemplateWizard nodo de proyecto y, a continuación, elija propiedades.In Solution Explorer, open the shortcut menu from the ItemTemplateWizard project node, and then choose Properties.

  2. En el Diseñador de proyectos, asegúrese de que la plataforma de destino está establecida en .NET Framework 4.5.In the Project Designer, make sure that the target framework is set to .NET Framework 4.5.

    Para proyectos de Visual C#, puede establecer este valor en el aplicación ficha. Para proyectos de Visual Basic, puede establecer este valor en el compilar ficha. Para obtener más información, consulte Cómo: Usar como destino una versión de .NET Framework.For Visual C# projects, you can set this value on the Application tab. For Visual Basic projects, you can set this value on the Compile tab. For more information, see How to: Target a Version of the .NET Framework.

  3. En el ItemTemplateWizard proyecto, agregue un ventana (WPF) elemento al proyecto y, a continuación, llame al elemento WizardWindow.In the ItemTemplateWizard project, add a Window (WPF) item to the project, and then name the item WizardWindow.

  4. Agregue dos archivos de código que se denominan CustomActionWizard y cadenas.Add two code files that are named CustomActionWizard and Strings.

  5. Abra el menú contextual para el ItemTemplateWizard del proyecto y, a continuación, elija Agregar referencia.Open the shortcut menu for the ItemTemplateWizard project, and then choose Add Reference.

  6. En el Administrador de referencias - ItemTemplateWizard cuadro de diálogo el ensamblados nodo, elija el extensiones nodo.In the Reference Manager - ItemTemplateWizard dialog box, under the Assemblies node, choose the Extensions node.

  7. Seleccione las casillas de verificación junto a los ensamblados siguientes y, a continuación, elija el Aceptar botón:Select the check boxes next to the following assemblies, and then choose the OK button:

    • EnvDTEEnvDTE

    • Microsoft.VisualStudio.Shell.11.0Microsoft.VisualStudio.Shell.11.0

    • Microsoft.VisualStudio.TemplateWizardInterfaceMicrosoft.VisualStudio.TemplateWizardInterface

  8. En el Explorador de soluciones, en el referencias carpeta para el proyecto ItemTemplateWizard, elija el EnvDTE referencia.In Solution Explorer, in the References folder for the ItemTemplateWizard project, choose the EnvDTE reference.

  9. En el propiedades ventana, cambie el valor de la Embed Interop Types propiedad False.In the Properties window, change the value of the Embed Interop Types property to False.

Definir la ubicación predeterminada y las cadenas de identificador para las acciones personalizadasDefine the default location and ID strings for custom actions

Cada acción personalizada tiene una ubicación y un identificador que se especifica en el GroupID y Location los atributos de la CustomAction elemento en el Elements.xml archivo.Every custom action has a location and ID that is specified in the GroupID and Location attributes of the CustomAction element in the Elements.xml file. En este paso, definirá algunas de las cadenas válidas para estos atributos en el proyecto ItemTemplateWizard.In this step, you define some of the valid strings for these attributes in the ItemTemplateWizard project. Al completar este tutorial, estas cadenas se escriben en el Elements.xml archivo en el elemento de proyecto acción personalizada cuando los usuarios especificar una ubicación y un identificador en el asistente.When you complete this walkthrough, these strings are written to the Elements.xml file in the Custom Action project item when users specify a location and an ID in the wizard.

Por motivos de simplicidad, este ejemplo admite solo un subconjunto de las ubicaciones predeterminadas disponibles e identificadores.For simplicity, this sample supports only a subset of the available default locations and IDs. Para obtener una lista completa, consulte Default Custom Action Locations e identificadores.For a full list, see Default Custom Action Locations and IDs.

Para definir la ubicación predeterminada y las cadenas de identificadorTo define the default location and ID strings

  1. Abrir.open.

  2. En el ItemTemplateWizard de proyecto, reemplace el código en el archivo de código las cadenas con el código siguiente.In the ItemTemplateWizard project, replace the code in the Strings code file with the following code.

    namespace ItemTemplateWizard
    {
        // This sample only supports several custom action locations and their group IDs. 
        internal class CustomActionLocations
        {
            internal const string ListEdit = "Microsoft.SharePoint.ListEdit";
            internal const string StandardMenu = "Microsoft.SharePoint.StandardMenu";
        }
    
        internal class StandardMenuGroupIds
        {
            internal const string Actions = "ActionsMenu";
            internal const string ActionsSurvey = "ActionsMenuForSurvey";
            internal const string NewMenu = "NewMenu";
            internal const string Settings = "SettingsMenu";
            internal const string SettingsSurvey = "SettingsMenuForSurvey";
            internal const string SiteActions = "SiteActions";
            internal const string Upload = "UploadMenu";
            internal const string ViewSelector = "ViewSelectorMenu";
        }
    
        internal class ListEditGroupIds
        {
            internal const string Communications = "Communications";
            internal const string GeneralSettings = "GeneralSettings";
            internal const string Permissions = "Permissions";
        }
    
        internal class DefaultTextBoxStrings
        {
            internal const string TitleText = "Replace this with your title";
            internal const string DescriptionText = "Replace this with your description";
            internal const string UrlText = "~site/Lists/Tasks/AllItems.aspx";
        }
    }
    
    ' This sample only supports several custom action locations and their group IDs. 
    Friend Class CustomActionLocations
        Friend Const ListEdit As String = "Microsoft.SharePoint.ListEdit"
        Friend Const StandardMenu As String = "Microsoft.SharePoint.StandardMenu"
    End Class
    
    Friend Class StandardMenuGroupIds
        Friend Const Actions As String = "ActionsMenu"
        Friend Const ActionsSurvey As String = "ActionsMenuForSurvey"
        Friend Const NewMenu As String = "NewMenu"
        Friend Const Settings As String = "SettingsMenu"
        Friend Const SettingsSurvey As String = "SettingsMenuForSurvey"
        Friend Const SiteActions As String = "SiteActions"
        Friend Const Upload As String = "UploadMenu"
        Friend Const ViewSelector As String = "ViewSelectorMenu"
    End Class
    
    Friend Class ListEditGroupIds
        Friend Const Communications As String = "Communications"
        Friend Const GeneralSettings As String = "GeneralSettings"
        Friend Const Permissions As String = "Permissions"
    End Class
    
    Friend Class DefaultTextBoxStrings
        Friend Const TitleText As String = "Replace this with your title"
        Friend Const DescriptionText As String = "Replace this with your description"
        Friend Const UrlText As String = "~site/Lists/Tasks/AllItems.aspx"
    End Class
    
    

Crear al Asistente para interfaz de usuarioCreate the wizard UI

Agregue XAML para definir la interfaz de usuario del asistente y agregue código para enlazar algunos de los controles en el Asistente para las cadenas de identificador.Add XAML to define the UI of the wizard, and add some code to bind some of the controls in the wizard to the ID strings. El asistente que se crea es similar al asistente integrado para los proyectos de SharePoint en Visual Studio.The wizard that you create resembles the built-in wizard for SharePoint projects in Visual Studio.

Para crear al Asistente para la interfaz de usuarioTo create the wizard UI

  1. En el ItemTemplateWizard de proyecto, abra el menú contextual para el WizardWindow.xaml de archivo y, a continuación, elija abrir para abrir la ventana en el diseñador.In the ItemTemplateWizard project, open the shortcut menu for the WizardWindow.xaml file, and then choose Open to open the window in the designer.

  2. En la vista XAML, reemplace el código XAML actual por el siguiente.In the XAML view, replace the current XAML with the following XAML. El XAML define una interfaz de usuario que incluye un encabezado, los controles para especificar el comportamiento de la acción personalizada y botones de navegación en la parte inferior de la ventana.The XAML defines a UI that includes a heading, controls for specifying the behavior of the custom action, and navigation buttons at the bottom of the window.

    Nota

    El proyecto tendrá algunos errores de compilación después de agregar este código.Your project will have some compile errors after you add this code. Estos errores desaparecerán al agregar código en pasos posteriores.These errors will go away when you add code in later steps.

    <ui:DialogWindow x:Class="ItemTemplateWizard.WizardWindow"
                     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                     xmlns:ui="clr-namespace:Microsoft.VisualStudio.PlatformUI;assembly=Microsoft.VisualStudio.Shell.11.0"        
                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                     Title="SharePoint Customization Wizard" Height="500" Width="700" ResizeMode="NoResize" 
                     Loaded="Window_Loaded" TextOptions.TextFormattingMode="Display">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="75*" />
                <RowDefinition Height="364*" />
                <RowDefinition Height="1*" />
                <RowDefinition Height="60*" />
            </Grid.RowDefinitions>
            <Grid Grid.Row="0" Name="headingGrid" Background="White">
                <Label Grid.Row="0" Content="Configure the Custom Action" Name="pageHeaderLabel" HorizontalAlignment="Left" 
                       VerticalAlignment="Center" Margin="18,0,0,0" FontWeight="ExtraBold" />
            </Grid>
            <Grid Grid.Row="1" Name="mainGrid">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="20*" />
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="400*" />
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                </Grid.RowDefinitions>
                <StackPanel Grid.Row="0" Grid.Column="1" Orientation="Vertical">
                    <Label Margin="0,20,0,0" Content="Location:" Name="locationLabel" FontWeight="Bold" />
                    <RadioButton Content="_List Edit" Margin="5,0,0,0" Name="listEditRadioButton" 
                                 Checked="listEditRadioButton_Checked" FontWeight="Normal"  />
                    <RadioButton Content="_Standard Menu" Margin="5,5,0,0" Name="standardMenuRadioButton" 
                                 Checked="standardMenuRadioButton_Checked" FontWeight="Normal" />
                </StackPanel>
                <Label Grid.Row="1" Grid.Column="1" Margin="0,15,0,0" Content="_Group ID:" Name="groupIdLabel" 
                       FontWeight="Bold" Target="{Binding ElementName=idComboBox}" />
                <ComboBox Grid.Row="1" Grid.Column="2" HorizontalAlignment="Left" Margin="0,15,0,0" Height="23" 
                          Width="253" Name="idComboBox" IsEditable="False" IsSynchronizedWithCurrentItem="True" />
                <Label Grid.Row="2" Grid.Column="1" Margin="0,15,0,0" Content="_Title:" Name="titleLabel" 
                       FontWeight="Bold" Target="{Binding ElementName=titleTextBox}" />
                <TextBox Grid.Row="2" Grid.Column="2" HorizontalAlignment="Left" Margin="0,15,0,0" Height="23" 
                         Name="titleTextBox" Width="410" Text="" />
                <Label Grid.Row="3" Grid.Column="1" Margin="0,15,0,0" Content="_Description:" Name="descriptionLabel" 
                       FontWeight="Bold" Target="{Binding ElementName=descriptionTextBox}" />
                <TextBox Grid.Row="3" Grid.Column="2" HorizontalAlignment="Left" Margin="0,15,0,0" Height="23" 
                         Name="descriptionTextBox" Width="410" Text="" />
                <Label Grid.Row="4" Grid.Column="1" Margin="0,15,0,0" Content="_URL:" Height="28" Name="urlLabel" 
                       FontWeight="Bold" Target="{Binding ElementName=urlTextBox}" />
                <TextBox Grid.Row="4" Grid.Column="2" HorizontalAlignment="Left" Margin="0,15,0,0" Height="23" 
                         Name="urlTextBox" Width="410" Text="" />
            </Grid>
            <Rectangle Grid.Row="2" Name="separatorRectangle" Fill="White"  />
            <StackPanel Grid.Row="3" Name="navigationPanel" Orientation="Horizontal">
                <Button Content="_Finish" Margin="500,0,0,0" Height="25" Name="finishButton" Width="85" 
                        Click="finishButton_Click" IsDefault="True" />
                <Button Content="Cancel" Margin="10,0,0,0" Height="25" Name="cancelButton" Width="85" IsCancel="True" />
            </StackPanel>
        </Grid>
    </ui:DialogWindow>
    

    Nota

    La ventana que se crea en este XAML se deriva el DialogWindow clase base.The window that's created in this XAML is derived from the DialogWindow base class. Cuando se agrega un cuadro de diálogo WPF personalizado en Visual Studio, se recomienda que el cuadro de diálogo se deriva de esta clase tiene un estilo coherente con otros cuadros de diálogo en Visual Studio y para evitar problemas que pueden producirse en caso contrario, con los cuadros de diálogo modal.When you add a custom WPF dialog box to Visual Studio, we recommend that you derive your dialog box from this class to have consistent styling with other dialog boxes in Visual Studio and to avoid issues that might otherwise occur with modal dialog boxes. Para obtener más información, consulte creación y administración de los cuadros de diálogo Modal.For more information, see Creating and Managing Modal Dialog Boxes.

  3. Si está desarrollando un proyecto de Visual Basic, quite el ItemTemplateWizard espacio de nombres desde el WizardWindow nombre de clase en el x:Class atributo de la Window elemento.If you're developing a Visual Basic project, remove the ItemTemplateWizard namespace from the WizardWindow class name in the x:Class attribute of the Window element. Este elemento aparece en la primera línea del código XAML.This element is in the first line of the XAML. Cuando haya terminado, la primera línea debe ser similar al código siguiente:When you're done, the first line should resemble the following code:

    <Window x:Class="WizardWindow"  
    
  4. En el archivo de código subyacente del archivo WizardWindow.xaml, reemplace el código actual con el código siguiente.In the code-behind file for the WizardWindow.xaml file, replace the current code with the following code.

    Public Class WizardWindow
        Private standardMenuGroups As List(Of String)
        Private listEditGroups As List(Of String)
        Private standardMenuGroupIdBinding As Binding
        Private listEditGroupIdBinding As Binding
        Private standardMenuGroupIdBindingView As ListCollectionView
        Private listEditGroupIdBindingView As ListCollectionView
    
        Private Sub Window_Loaded(ByVal sender As Object, ByVal e As RoutedEventArgs)
            standardMenuGroups = New List(Of String) From {
                StandardMenuGroupIds.Actions,
                StandardMenuGroupIds.ActionsSurvey,
                StandardMenuGroupIds.NewMenu,
                StandardMenuGroupIds.Settings,
                StandardMenuGroupIds.SettingsSurvey,
                StandardMenuGroupIds.SiteActions,
                StandardMenuGroupIds.Upload,
                StandardMenuGroupIds.ViewSelector}
            listEditGroups = New List(Of String) From {
                ListEditGroupIds.Communications,
                ListEditGroupIds.GeneralSettings,
                ListEditGroupIds.Permissions}
    
            standardMenuGroupIdBinding = New Binding()
            standardMenuGroupIdBinding.Source = standardMenuGroups
            listEditGroupIdBinding = New Binding()
            listEditGroupIdBinding.Source = listEditGroups
    
            standardMenuGroupIdBindingView = CType(CollectionViewSource.GetDefaultView(standardMenuGroups), ListCollectionView)
            listEditGroupIdBindingView = CType(CollectionViewSource.GetDefaultView(listEditGroups), ListCollectionView)
    
            standardMenuRadioButton.IsChecked = True
        End Sub
    
        Private Sub standardMenuRadioButton_Checked(ByVal sender As Object, ByVal e As RoutedEventArgs)
            BindingOperations.ClearBinding(idComboBox, ComboBox.ItemsSourceProperty)
            idComboBox.SetBinding(ComboBox.ItemsSourceProperty, standardMenuGroupIdBinding)
            standardMenuGroupIdBindingView.MoveCurrentToFirst()
        End Sub
    
        Private Sub listEditRadioButton_Checked(ByVal sender As Object, ByVal e As RoutedEventArgs)
            BindingOperations.ClearBinding(idComboBox, ComboBox.ItemsSourceProperty)
            idComboBox.SetBinding(ComboBox.ItemsSourceProperty, listEditGroupIdBinding)
            listEditGroupIdBindingView.MoveCurrentToFirst()
        End Sub
    
        Private Sub finishButton_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
            Me.DialogResult = True
            Me.Close()
        End Sub
    End Class
    
    using System.Collections.Generic;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using Microsoft.VisualStudio.PlatformUI;
    
    namespace ItemTemplateWizard
    {
        public partial class WizardWindow : DialogWindow
        {
            private List<string> standardMenuGroups;
            private List<string> listEditGroups;
            private Binding standardMenuGroupIdBinding;
            private Binding listEditGroupIdBinding;
            private ListCollectionView standardMenuGroupIdBindingView;
            private ListCollectionView listEditGroupIdBindingView;
    
            public WizardWindow()
            {
                InitializeComponent();
            }
    
            private void Window_Loaded(object sender, RoutedEventArgs e)
            {
                standardMenuGroups = new List<string>() { 
                    StandardMenuGroupIds.Actions,
                    StandardMenuGroupIds.ActionsSurvey,
                    StandardMenuGroupIds.NewMenu, 
                    StandardMenuGroupIds.Settings, 
                    StandardMenuGroupIds.SettingsSurvey,
                    StandardMenuGroupIds.SiteActions, 
                    StandardMenuGroupIds.Upload, 
                    StandardMenuGroupIds.ViewSelector };
                listEditGroups = new List<string>() { 
                    ListEditGroupIds.Communications, 
                    ListEditGroupIds.GeneralSettings,
                    ListEditGroupIds.Permissions };
    
                standardMenuGroupIdBinding = new Binding();
                standardMenuGroupIdBinding.Source = standardMenuGroups;
                listEditGroupIdBinding = new Binding();
                listEditGroupIdBinding.Source = listEditGroups;
    
                standardMenuGroupIdBindingView = (ListCollectionView)CollectionViewSource.GetDefaultView(standardMenuGroups);
                listEditGroupIdBindingView = (ListCollectionView)CollectionViewSource.GetDefaultView(listEditGroups);
    
                standardMenuRadioButton.IsChecked = true;
            }
    
            private void standardMenuRadioButton_Checked(object sender, RoutedEventArgs e)
            {
                BindingOperations.ClearBinding(idComboBox, ComboBox.ItemsSourceProperty);
                idComboBox.SetBinding(ComboBox.ItemsSourceProperty, standardMenuGroupIdBinding);
                standardMenuGroupIdBindingView.MoveCurrentToFirst();
            }
    
            private void listEditRadioButton_Checked(object sender, RoutedEventArgs e)
            {
                BindingOperations.ClearBinding(idComboBox, ComboBox.ItemsSourceProperty);
                idComboBox.SetBinding(ComboBox.ItemsSourceProperty, listEditGroupIdBinding);
                listEditGroupIdBindingView.MoveCurrentToFirst();
            }
    
            private void finishButton_Click(object sender, RoutedEventArgs e)
            {
                this.DialogResult = true;
                this.Close();
            }
        }
    }
    

El Asistente para implementarImplement the wizard

Definir la funcionalidad del asistente implementando la IWizard interfaz.Define the functionality of the wizard by implementing the IWizard interface.

Para implementar el asistenteTo implement the wizard

  1. En el ItemTemplateWizard proyecto, abra el CustomActionWizard archivo de código y, a continuación, reemplace el código actual de este archivo con el código siguiente:In the ItemTemplateWizard project, open the CustomActionWizard code file, and then replace the current code in this file with the following code:

    using EnvDTE;
    using Microsoft.VisualStudio.TemplateWizard;
    using System;
    using System.Collections.Generic;
    
    namespace ItemTemplateWizard
    {
        public class CustomActionWizard : IWizard
        {
            private WizardWindow wizardPage;
    
            public CustomActionWizard()
            {
            }
    
            #region IWizard Methods
    
            public void RunStarted(object automationObject, Dictionary<string, string> replacementsDictionary, 
                WizardRunKind runKind, object[] customParams)
            {
                wizardPage = new WizardWindow();
                Nullable<bool> dialogCompleted = wizardPage.ShowModal();
                
                if (dialogCompleted == true)
                {
                    PopulateReplacementDictionary(replacementsDictionary);
                }
                else
                {
                    throw new WizardCancelledException();
                }
            }
    
            // Always return true; this IWizard implementation throws a WizardCancelledException
            // that is handled by Visual Studio if the user cancels the wizard.
            public bool ShouldAddProjectItem(string filePath)
            {
                return true;
            }
    
            // The following IWizard methods are not implemented in this example.
            public void BeforeOpeningFile(ProjectItem projectItem)
            {
            }
    
            public void ProjectFinishedGenerating(Project project)
            {
            }
    
            public void ProjectItemFinishedGenerating(ProjectItem projectItem)
            {
            }
    
            public void RunFinished()
            {
            }
    
            #endregion
    
            private void PopulateReplacementDictionary(Dictionary<string, string> replacementsDictionary)
            {
                // Fill in the replacement values from the UI selections on the wizard page. These values are automatically inserted
                // into the Elements.xml file for the custom action.
                string locationValue = (bool)wizardPage.standardMenuRadioButton.IsChecked ?
                    CustomActionLocations.StandardMenu : CustomActionLocations.ListEdit;
                replacementsDictionary.Add("$LocationValue$", locationValue);
                replacementsDictionary.Add("$GroupIdValue$", (string)wizardPage.idComboBox.SelectedItem);
                replacementsDictionary.Add("$IdValue$", Guid.NewGuid().ToString());
    
                string titleText = DefaultTextBoxStrings.TitleText;
                if (!String.IsNullOrEmpty(wizardPage.titleTextBox.Text))
                {
                    titleText = wizardPage.titleTextBox.Text;
                }
    
                string descriptionText = DefaultTextBoxStrings.DescriptionText;
                if (!String.IsNullOrEmpty(wizardPage.descriptionTextBox.Text))
                {
                    descriptionText = wizardPage.descriptionTextBox.Text;
                }
    
                string urlText = DefaultTextBoxStrings.UrlText;
                if (!String.IsNullOrEmpty(wizardPage.urlTextBox.Text))
                {
                    urlText = wizardPage.urlTextBox.Text;
                }
    
                replacementsDictionary.Add("$TitleValue$", titleText);
                replacementsDictionary.Add("$DescriptionValue$", descriptionText);
                replacementsDictionary.Add("$UrlValue$", urlText);
            }
        }
    }
    
    Imports EnvDTE
    Imports Microsoft.VisualStudio.TemplateWizard
    Imports System
    Imports System.Collections.Generic
    
    Public Class CustomActionWizard
        Implements IWizard
    
        Private wizardPage As WizardWindow
    
    #Region "IWizard Methods"
    
        Public Sub RunStarted(ByVal automationObject As Object, ByVal replacementsDictionary As Dictionary(Of String, String), _
            ByVal runKind As WizardRunKind, ByVal customParams() As Object) Implements IWizard.RunStarted
            wizardPage = New WizardWindow()
            Dim dialogCompleted? As Boolean = wizardPage.ShowModal()
    
            If (dialogCompleted = True) Then
                PopulateReplacementDictionary(replacementsDictionary)
            Else
                Throw New WizardCancelledException()
            End If
        End Sub
    
        ' Always return true; this IWizard implementation throws a WizardCancelledException
        ' that is handled by Visual Studio if the user cancels the wizard.
        Public Function ShouldAddProjectItem(ByVal filePath As String) As Boolean _
            Implements IWizard.ShouldAddProjectItem
            Return True
        End Function
    
        ' The following IWizard methods are not implemented in this example.
        Public Sub BeforeOpeningFile(ByVal projectItem As ProjectItem) _
            Implements IWizard.BeforeOpeningFile
        End Sub
    
        Public Sub ProjectFinishedGenerating(ByVal project As Project) _
            Implements IWizard.ProjectFinishedGenerating
        End Sub
    
        Public Sub ProjectItemFinishedGenerating(ByVal projectItem As ProjectItem) _
            Implements IWizard.ProjectItemFinishedGenerating
        End Sub
    
        Public Sub RunFinished() Implements IWizard.RunFinished
        End Sub
    
    #End Region
    
        Private Sub PopulateReplacementDictionary(ByVal replacementsDictionary As Dictionary(Of String, String))
    
            ' Fill in the replacement values from the UI selections on the wizard page. These values are automatically inserted
            ' into the Elements.xml file for the custom action.
            Dim locationValue As String = If(wizardPage.standardMenuRadioButton.IsChecked,
                    CustomActionLocations.StandardMenu, CustomActionLocations.ListEdit)
            replacementsDictionary.Add("$LocationValue$", locationValue)
            replacementsDictionary.Add("$GroupIdValue$", CType(wizardPage.idComboBox.SelectedItem, String))
            replacementsDictionary.Add("$IdValue$", Guid.NewGuid().ToString())
    
            Dim titleText As String = DefaultTextBoxStrings.TitleText
            If False = String.IsNullOrEmpty(wizardPage.titleTextBox.Text) Then
                titleText = wizardPage.titleTextBox.Text
            End If
    
            Dim descriptionText As String = DefaultTextBoxStrings.DescriptionText
            If False = String.IsNullOrEmpty(wizardPage.descriptionTextBox.Text) Then
                descriptionText = wizardPage.descriptionTextBox.Text
            End If
    
            Dim urlText As String = DefaultTextBoxStrings.UrlText
            If False = String.IsNullOrEmpty(wizardPage.urlTextBox.Text) Then
                urlText = wizardPage.urlTextBox.Text
            End If
    
            replacementsDictionary.Add("$TitleValue$", titleText)
            replacementsDictionary.Add("$DescriptionValue$", descriptionText)
            replacementsDictionary.Add("$UrlValue$", urlText)
        End Sub
    End Class
    

Punto de controlCheckpoint

En este punto del tutorial, todo el código del asistente está en el proyecto.At this point in the walkthrough, all the code for the wizard is now in the project. Compile el proyecto para asegurarse de que se compila sin errores.Build the project to make sure that it compiles without errors.

Para compilar el proyectoTo build your project

  1. En la barra de menús, elija Compilar > Compilar solución.On the menu bar, choose Build > Build Solution.

Asociar al Asistente para la plantilla de elementoAssociate the wizard with the item template

Ahora que ha implementado el asistente, debe asociarlo con el acción personalizada plantilla de elemento siguiendo los tres pasos principales:Now that you have implemented the wizard, you must associate it with the Custom Action item template by completing three main steps:

  1. Firmar el ensamblado del asistente con un nombre seguro.Sign the wizard assembly with a strong name.

  2. Obtener el token de clave pública del ensamblado del asistente.Get the public key token for the wizard assembly.

  3. Agregue una referencia al ensamblado del asistente en el archivo .vstemplate para la acción personalizada plantilla de elemento.Add a reference to the wizard assembly in the .vstemplate file for the Custom Action item template.

Para firmar el ensamblado del asistente con un nombre seguroTo sign the wizard assembly with a strong name

  1. En el Explorador de soluciones, abra el menú contextual de la ItemTemplateWizard nodo de proyecto y, a continuación, elija propiedades.In Solution Explorer, open the shortcut menu from the ItemTemplateWizard project node, and then choose Properties.

  2. En el firma ficha, seleccione el firmar el ensamblado casilla de verificación.On the Signing tab, select the Sign the assembly check box.

  3. En el elegir un archivo de clave de nombre seguro elija <nuevo... >.In the Choose a strong name key file list, choose <New...>.

  4. En el crear clave de nombre seguro diálogo cuadro, escriba un nombre, desactive la proteger mi archivo de clave con una contraseña casilla de verificación y, a continuación, elija el Aceptar botón.In the Create Strong Name Key dialog box, enter a name, clear the Protect my key file with a password check box, and then choose the OK button.

  5. En la barra de menús, elija Compilar > Compilar solución.On the menu bar, choose Build > Build Solution.

Para obtener el token de clave pública del ensamblado del asistenteTo get the public key token for the wizard assembly

  1. En una ventana del símbolo del sistema de Visual Studio, ejecute el siguiente comando, reemplazando PathToWizardAssembly con la ruta de acceso completa al ensamblado ItemTemplateWizard.dll integrado para el proyecto ItemTemplateWizard en el desarrollo equipo.In a Visual Studio Command Prompt window, run the following command, replacing PathToWizardAssembly with the full path to the built ItemTemplateWizard.dll assembly for the ItemTemplateWizard project on your development computer.

    sn.exe -T PathToWizardAssembly  
    

    El token de clave pública para el ItemTemplateWizard.dll ensamblado se escribe en la ventana del símbolo del sistema de Visual Studio.The public key token for the ItemTemplateWizard.dll assembly is written to the Visual Studio Command Prompt window.

  2. Mantenga abierta la ventana del símbolo del sistema de Visual Studio.Keep the Visual Studio Command Prompt window open. Necesitará el token de clave pública para completar el procedimiento siguiente.You'll need the public key token to complete the next procedure.

Para agregar una referencia al ensamblado del asistente del archivo .vstemplateTo add a reference to the wizard assembly in the .vstemplate file

  1. En el Explorador de soluciones, expanda el ItemTemplate nodo de proyecto y, a continuación, abra el ItemTemplate.vstemplate archivo.In Solution Explorer, expand the ItemTemplate project node, and then open the ItemTemplate.vstemplate file.

  2. Cuando se acerque el final del archivo, agregue el siguiente elemento WizardExtension entre las etiquetas </TemplateContent> y </VSTemplate>.Near the end of the file, add the following WizardExtension element between the </TemplateContent> and </VSTemplate> tags. Reemplace el YourToken valor de la PublicKeyToken atributo con el token de clave pública que obtuvo en el procedimiento anterior.Replace the YourToken value of the PublicKeyToken attribute with the public key token that you obtained in the previous procedure.

    <WizardExtension>  
      <Assembly>ItemTemplateWizard, Version=1.0.0.0, Culture=neutral, PublicKeyToken=YourToken</Assembly>  
      <FullClassName>ItemTemplateWizard.CustomActionWizard</FullClassName>  
    </WizardExtension>  
    

    Para obtener más información sobre la WizardExtension elemento, vea elemento WizardExtension (plantillas de Visual Studio).For more information about the WizardExtension element, see WizardExtension Element (Visual Studio Templates).

  3. Guarde y cierre el archivo.Save and close the file.

Agregar parámetros reemplazables para el Elements.xml archivo en la plantilla de elementoAdd replaceable parameters to the Elements.xml file in the item template

Agregue varios parámetros reemplazables para el Elements.xml archivo en el proyecto ItemTemplate.Add several replaceable parameters to the Elements.xml file in the ItemTemplate project. Estos parámetros se inicializan en el método PopulateReplacementDictionary de la clase CustomActionWizard que definió anteriormente.These parameters are initialized in the PopulateReplacementDictionary method in the CustomActionWizard class that you defined earlier. Cuando un usuario agrega un elemento de proyecto acción personalizada a un proyecto, Visual Studio reemplaza automáticamente estos parámetros en el Elements.xml archivo en el nuevo elemento de proyecto con los valores especificados en el asistente.When a user adds a Custom Action project item to a project, Visual Studio automatically replaces these parameters in the Elements.xml file in the new project item with the values that they specified in the wizard.

Un parámetro reemplazable es un token que empieza y termina por el carácter del signo de dólar ($).A replaceable parameter is a token that starts and ends with the dollar sign ($) character. Además de definir sus propios parámetros reemplazables, puede usar parámetros integrados que define el sistema de proyectos de SharePoint y la inicializa.In addition to defining your own replaceable parameters, you can use built-in parameters that the SharePoint project system defines and initializes. Para obtener más información, consulte parámetros reemplazables.For more information, see Replaceable parameters.

Para agregar parámetros reemplazables para el Elements.xml archivoTo add replaceable parameters to the Elements.xml file

  1. En el proyecto ItemTemplate, reemplace el contenido de la Elements.xml archivo con el siguiente código XML.In the ItemTemplate project, replace the contents of the Elements.xml file with the following XML.

    <?xml version="1.0" encoding="utf-8" ?>  
    <Elements Id="$guid8$" xmlns="http://schemas.microsoft.com/sharepoint/">  
      <CustomAction Id="$IdValue$"  
                    GroupId="$GroupIdValue$"  
                    Location="$LocationValue$"  
                    Sequence="1000"  
                    Title="$TitleValue$"  
                    Description="$DescriptionValue$" >  
        <UrlAction Url="$UrlValue$"/>  
      </CustomAction>  
    </Elements>  
    

    El nuevo XML cambia los valores de la Id, GroupId, Location, Description, y Url atributos a parámetros reemplazables.The new XML changes the values of the Id, GroupId, Location, Description, and Url attributes to replaceable parameters.

  2. Guarde y cierre el archivo.Save and close the file.

Agregar al asistente al paquete VSIXAdd the wizard to the VSIX package

En el archivo source.extension.vsixmanifest del proyecto VSIX, agregue una referencia al proyecto de Asistente para que se implementa con el paquete VSIX que contiene el elemento de proyecto.In the source.extension.vsixmanifest file in the VSIX project, add a reference to the wizard project so that it's deployed with the VSIX package that contains the project item.

Para agregar el asistente al paquete VSIXTo add the wizard to the VSIX package

  1. En el Explorador de soluciones, abra el menú contextual de la source.extension.vsixmanifest de archivos en el proyecto CustomActionProjectItem y, a continuación, elija abrir para abrir el archivo en el editor de manifiestos.In Solution Explorer, open the shortcut menu from the source.extension.vsixmanifest file in the CustomActionProjectItem project, and then choose Open to open the file in the manifest editor.

  2. En el editor de manifiestos, elija el activos y, después, elija el New botón.In the manifest editor, choose the Assets tab, then choose the New button.

    El Agregar nuevo activo aparece el cuadro de diálogo.The Add New Asset dialog box appears.

  3. En el tipo elija Microsoft.VisualStudio.Assembly.In the Type list, choose Microsoft.VisualStudio.Assembly.

  4. En el origen elija un proyecto de la solución actual.In the Source list, choose A project in current solution.

  5. En el proyecto elija ItemTemplateWizardy, a continuación, elija el Aceptar botón.In the Project list, choose ItemTemplateWizard, and then choose the OK button.

  6. En la barra de menús, elija compilar > compilar solucióny, a continuación, asegúrese de que la solución se compila sin errores.On the menu bar, choose Build > Build Solution, and then make sure that the solution compiles without errors.

El Asistente para pruebaTest the wizard

Ahora está preparado para probar el asistente.You are now ready to test the wizard. Primero, empiece a depurar la solución CustomActionProjectItem en la instancia experimental de Visual Studio.First, start to debug the CustomActionProjectItem solution in the experimental instance of Visual Studio. A continuación, pruebe al Asistente para el elemento de proyecto acción personalizada en un proyecto de SharePoint en la instancia experimental de Visual Studio.Then test the wizard for the Custom Action project item in a SharePoint project in the experimental instance of Visual Studio. Por último, compile y ejecute el proyecto SharePoint para comprobar que la acción personalizada funciona del modo esperado.Finally, build and run the SharePoint project to verify that the custom action works as expected.

Para empezar a depurar la soluciónTo start to debug the solution

  1. Reinicie Visual Studio con credenciales administrativas y abra la solución CustomActionProjectItem.Restart Visual Studio with administrative credentials, and then open the CustomActionProjectItem solution.

  2. En el proyecto ItemTemplateWizard, abra el archivo de código CustomActionWizard y, a continuación, agregue un punto de interrupción a la primera línea de código en el RunStarted método.In the ItemTemplateWizard project, open the CustomActionWizard code file, and then add a breakpoint to the first line of code in the RunStarted method.

  3. En la barra de menús, elija depurar > excepciones.On the menu bar, choose Debug > Exceptions.

  4. En el excepciones diálogo cuadro, asegúrese de que el producida y User-unhandled casillas de verificación de excepciones Common Language Runtimeestán desactivadas y, a continuación, elija el Aceptar botón.In the Exceptions dialog box, make sure that the Thrown and User-unhandled check boxes for Common Language Runtime Exceptions are cleared, and then choose the OK button.

  5. Iniciar la depuración eligiendo el F5 clave, o bien, en la barra de menús, elija depurar > Iniciar depuración.Start debugging by choosing the F5 key, or, on the menu bar, choosing Debug > Start Debugging.

    Visual Studio instala la extensión en %UserProfile%\AppData\Local\Microsoft\VisualStudio\11.0Exp\Extensions\Contoso\Custom Action Project item\1.0 e inicia una instancia experimental de Visual Studio.Visual Studio installs the extension to %UserProfile%\AppData\Local\Microsoft\VisualStudio\11.0Exp\Extensions\Contoso\Custom Action Project Item\1.0 and starts an experimental instance of Visual Studio. Probará el elemento de proyecto en esta instancia de Visual Studio.You'll test the project item in this instance of Visual Studio.

Para probar el asistente en Visual StudioTo test the wizard in Visual Studio

  1. En la instancia experimental de Visual Studio, en la barra de menús, elija archivo > New > proyecto.In the experimental instance of Visual Studio, on the menu bar, choose File > New > Project.

  2. Expanda el Visual C# o Visual Basic nodo (dependiendo del lenguaje que admita la plantilla de elemento), expanda el SharePoint nodo y, a continuación, elija el 2010 nodo.Expand the Visual C# or Visual Basic node (depending on the language that your item template supports), expand the SharePoint node, and then choose the 2010 node.

  3. En la lista de plantillas de proyecto, elija proyecto de SharePoint 2010, denomine el proyecto CustomActionWizardTesty, a continuación, elija el Aceptar botón.In the list of project templates, choose SharePoint 2010 Project, name the project CustomActionWizardTest, and then choose the OK button.

  4. En el Asistente de personalización de SharePoint, escriba la dirección URL del sitio que desea usar para la depuración y, a continuación, elija el finalizar botón.In the SharePoint Customization Wizard, enter the URL of the site that you want to use for debugging, and then choose the Finish button.

  5. En el Explorador de soluciones, abra el menú contextual del nodo de proyecto, elija agregary, a continuación, elija nuevo elemento.In Solution Explorer, open the shortcut menu for the project node, choose Add, and then choose New Item.

  6. En el Agregar nuevo elemento - CustomItemWizardTest cuadro de diálogo, expanda el SharePoint nodo y, a continuación, expanda el 2010 nodo.In the Add New Item - CustomItemWizardTest dialog box, expand the SharePoint node, and then expand the 2010 node.

  7. En la lista de elementos de proyecto, elija el acción personalizada elemento y, a continuación, elija el agregar botón.In the list of project items, choose the Custom Action item, and then choose the Add button.

  8. Compruebe que el código de la otra instancia de Visual Studio se detiene en el punto de interrupción que estableció anteriormente en el método RunStarted.Verify that the code in the other instance of Visual Studio stops on the breakpoint that you set earlier in the RunStarted method.

  9. Continuar depurando el proyecto eligiendo la F5 clave o, en la barra de menús, elija depurar > continuar.Continue to debug the project by choosing the F5 key or, on the menu bar, choosing Debug > Continue.

    Aparece el Asistente de personalización de SharePoint.The SharePoint Customization Wizard appears.

  10. En ubicación, elija el Editar lista botón de opción.Under Location, choose the List Edit option button.

  11. En el Id. de grupo elija comunicaciones.In the Group ID list, choose Communications.

  12. En el título , escriba Centro para desarrolladores de SharePoint.In the Title box, enter SharePoint Developer Center.

  13. En el descripción , escriba abre el sitio Web de SharePoint Developer Center.In the Description box, enter Opens the SharePoint Developer Center website.

  14. En el URL , escriba http://msdn.microsoft.com/sharepoint/default.aspxy, a continuación, elija el finalizar botón.In the URL box, enter http://msdn.microsoft.com/sharepoint/default.aspx, and then choose the Finish button.

    Visual Studio agrega un elemento que se denomina CustomAction1 a su proyecto y abre el Elements.xml archivo en el editor.Visual Studio adds an item that's named CustomAction1 to your project and opens the Elements.xml file in the editor. Compruebe que Elements.xml contiene los valores que especificó en el asistente.Verify that Elements.xml contains the values that you specified in the wizard.

Para probar la acción personalizada en SharePointTo test the custom action in SharePoint

  1. En la instancia experimental de Visual Studio, elija el F5 clave o, en la barra de menús, elija depurar > Iniciar depuración.In the experimental instance of Visual Studio, choose the F5 key or, on the menu bar, choose Debug > Start Debugging.

    La acción personalizada se empaqueta e implementa en el sitio de SharePoint especificado por el dirección URL del sitio propiedad del proyecto y el explorador web se abre en la página predeterminada de este sitio.The custom action is packaged and deployed to the SharePoint site specified by the Site URL property of the project, and the web browser opens to the default page of this site.

    Nota

    Si el depuración de scripts deshabilitada aparece el cuadro de diálogo, elija el botón.If the Script Debugging Disabled dialog box appears, choose the Yes button.

  2. En el área de listas del sitio de SharePoint, elija el tareas vínculo.In the Lists area of the SharePoint site, choose the Tasks link.

    El tareas: todas las tareas aparece la página.The Tasks - All Tasks page appears.

  3. En el herramientas de lista pestaña de la cinta de opciones, elija la lista ficha y, a continuación, en el configuración grupo, elija configuración de la lista.On the List Tools tab of the ribbon, choose the List tab, and then, in the Settings group, choose List Settings.

    El configuración de la lista aparece la página.The List Settings page appears.

  4. En el comunicaciones encabezado en la parte superior de la página, elija el Centro para desarrolladores de SharePoint vincular, compruebe que el explorador abre el sitio Web http://msdn.microsoft.com/sharepoint/default.aspxy, a continuación, cierre el explorador.Under the Communications heading near the top of the page, choose the SharePoint Developer Center link, verify that the browser opens the website http://msdn.microsoft.com/sharepoint/default.aspx, and then close the browser.

Limpiar el equipo de desarrolloCleaning up the development computer

Después de probar el elemento de proyecto, quite la plantilla de elemento de proyecto de la instancia experimental de Visual Studio.After you finish testing the project item, remove the project item template from the experimental instance of Visual Studio.

Para limpiar el equipo de desarrolloTo clean up the development computer

  1. En la instancia experimental de Visual Studio, en la barra de menús, elija herramientas > extensiones y actualizaciones.In the experimental instance of Visual Studio, on the menu bar, choose Tools > Extensions and Updates.

    Se abre el cuadro de diálogo Extensiones y actualizaciones.The Extensions and Updates dialog box opens.

  2. En la lista de extensiones, elija el Custom Action Project Item extensión y, a continuación, elija el desinstalar botón.In the list of extensions, choose the Custom Action Project Item extension, and then choose the Uninstall button.

  3. En el cuadro de diálogo que aparece, elija el botón para confirmar que desea desinstalar la extensión y, a continuación, elija el reiniciar ahora botón para completar la desinstalación.In the dialog box that appears, choose the Yes button to confirm that you want to uninstall the extension, and then choose the Restart Now button to complete the uninstallation.

  4. Cierre ambas instancias de Visual Studio (la instancia experimental y la instancia de Visual Studio en el que está abierta la solución CustomActionProjectItem).Close both instances of Visual Studio (the experimental instance and the instance of Visual Studio in which the CustomActionProjectItem solution is open).

Vea tambiénSee also

Tutorial: Crear un elemento de proyecto de acción personalizado con una plantilla de elementos, parte 1 Walkthrough: Create a custom action project item with an item template, Part 1
Definir tipos de elemento de proyecto de SharePoint personalizados Define custom SharePoint project item types
Crear plantillas de elemento y plantillas de proyecto para los elementos de proyecto de SharePoint Create item templates and project templates for SharePoint project items
Referencia de esquema de plantillas de Visual Studio Visual Studio Template Schema Reference
Cómo: usar asistentes con plantillas de proyecto How to: Use Wizards with Project Templates
Los identificadores y las ubicaciones predeterminadas de la acción personalizadaDefault Custom Action Locations and IDs