Pregunta

Estoy creando una página web que actúa como una nueva forma.Basado en una vista, estoy subiendo a los campos y los procesamos en mi webpart con SPFIELD.FIELDRENDERINGCONTROL.

Mis columnas son columnas del sitio, en este nivel, se han realizado algunos, se agregaron a un tipo de contenido, que se ha agregado a una lista.Después de agregarse a la lista, se han requerido ciertas columnas que no se requirieron, y algunas que se requirieron en el nivel de columna del sitio ahora no.

a continuación es el código que estoy usando para hacer mi formulario.No importa lo que haya intentado, la representación del control parece ser agarrada desde el nivel de columna del sitio, no el nivel de tipo de contenido de la lista.No puedo hacer el control de un SpFieldlink.

He puesto comentarios dentro del código en el área, creo que podría necesitar enmendar.

                try
                {
                    Table table = new Table();
                    table.CssClass = "hlwp_DSCreateEditTable";
                    TableRow row;
                    TableCell cell;
                    SPContentType ct = spList.ContentTypes[ContentTypeName];


                for (int i = 0; i < spView.ViewFields.Count; i++)
                {
                    string fieldName = spView.ViewFields[i];
                    //The flink holds the information at the content type level in the list.
                    SPFieldLink flink = ct.FieldLinks[fieldName];
                    SPField field = spList.Fields.GetField(fieldName);

                    row = new TableRow();
                    row.CssClass = "hlwp_DSCreateEditRow";
                    cell = new TableCell();
                    cell.CssClass = "hlwp_DSCreateEditTitleCell";



    //Even tried setting the field.required to match the flink.required.
    //When debugging and following the code through it stays the same as flink.required, 
    //but if you call Page.Validate() it displays errors on the controls 
    //that are required at the site column level not list content type level.

                    if (flink != null)
                    {
                        field.Required = flink.Required;
                    }

                    if (field.Required)
                    {
                        cell.Text = field.Title + "<font color='red'>*</font>";
                    }
                    else
                    {
                        cell.Text = field.Title;
                    }

                    row.Cells.Add(cell);
                    cell = new TableCell();
                    cell.CssClass = "hlwp_DSCreateEditControlCell";
                    Control cntrl = HelperClass.GetSharePointControls(field, spList, itemId);
                    if (cntrl == null) continue;
                    cell.Controls.Add(cntrl);
                    row.Cells.Add(cell);
                    table.Rows.Add(row);

                }

helperclass.getsharepointcontrols

public static Control GetSharePointControls(SPField field, SPList list, int itemId)
        {
          // check if the field is a buildIn field, or can be rendered by a SharePoint Control
            if (field == null || field.FieldRenderingControl == null || field.Hidden) return null;

        Control ctrl = null;
        SPControlMode mode = SPControlMode.Invalid;

        if (itemId > 0)
            mode = SPControlMode.Edit;
        else
            mode = SPControlMode.New;

//Wondering if it's something to do with the context, as later on you set this context to the RenderingContext.
            var controlContext = SPContext.GetContext(System.Web.HttpContext.Current, itemId, list.ID, SPContext.Current.Web);



        SPContext.Current.FormContext.SetFormMode(mode, true);
        controlContext.FormContext.SetFormMode(mode, true);


        try
        {
                BaseFieldControl webControl = field.FieldRenderingControl;
                webControl.ListId = list.ID;
                webControl.ControlMode = mode;
                webControl.ItemId = itemId;
                webControl.FieldName = field.Title;
                webControl.ID = GetControlID(field); //Creates a unique ID.

                webControl.RenderContext = controlContext;
                webControl.ItemContext = controlContext;

                ctrl = webControl;
            }
            return ctrl;
        }
        catch (Exception ex)
        {
            var errorLabel = new Label
            {
                ID = "ErrorLabel",
                Text = String.Format("Error in GetSharePointControls:<br/>{0}", ex)
            };
            return errorLabel;
        }
    }

Si alguien tiene alguna idea, estaría muy agradecido.Incluso he intentado reflexionar sobre el código de Microsoft con un éxito limitado.

¿Fue útil?

Solución 2

He mirado más lejos en esto, y parece que el SPFIELD lees en el estado requerido del campo Lista. Sin embargo, en una lista personalizada, puede editar el campo requerido haciendo clic en el nombre de la columna en la configuración de la lista.

Para una biblioteca de documentos que falta la configuración de campo requerida. La única forma en que puede establecer el campo requerido está en el tipo de contenido del sitio y presionar el cambio, (que cambiaría el campo requerido en todas partes, no solo en la lista dada) o el código, usando .net o PowerShell para configurar el campo en la lista para requerir. Luego, elimine cualquier referencia en mi código original para SPFIELKLINK.

$web = Get-SPWeb "[YourSite]"
$list = $web.GetListFromUrl("[Your List URL]")
$field = $list.Fields["[Field Name"]
Write-Host "Previous Value:" $field.Required
$field.Required = $true
$field.Update()
Write-Host "The field" $field.Title "is now set to" $field.Required

Es extraño cómo el código original publicé actúa muy diferente en una lista personalizada en comparación con una biblioteca de documentos.

Descubrí esto, visualizando la descripción del campo en mi webpart. Si la descripción local fue diferente a la descripción de la columna del sitio, cuando llame a Field.Descripción, siempre recibió la descripción local. Lo que significó llamar a SPFIELD de la lista le brindó los valores de la columna que se proporciona en la lista no desde la columna del sitio. Entonces, PowerShelled una consulta si se requirió la columna de la lista, y aunque estaba en la columna del sitio, no fue para la lista.

La fijación alternativa en lugar de usar PowerShell es crear una página de diseños que llama desde la configuración de la biblioteca que le permite modificar el valor requerido para cada una de las columnas en la lista, ya que claramente Microsoft se ha perdido esta funcionalidad. (Tal vez por una buena razón que no haya encontrado todavía).

Otros consejos

Tal vez ver cómo el proyecto CodePlex Batchedit lo hace: http://sp2010batchedit.codeplex.com/

Licenciado bajo: CC-BY-SA con atribución
scroll top