Pregunta

Estoy desafiando este requisito:

El cliente quiere mostrar solo elementos de lista en la parte web de la lista de listados en función del valor del perfil de usuario y también preservar la funcionalidad de la parte web de la lista de la lista como la clasificación y el filtrado de OOB.Hago alguna investigación y aquí está mi hallazgo:

  • Intento usar el mismo enfoque que en la lista aquí .Sin embargo, este enfoque tiene un inconveniente muy feo.Reescribe la vista en cada página Actualizar y abandona la consulta en la vista basada en la propiedad del perfil de usuario del último usuario, no es aceptable.

    Por lo tanto, me gustaría generar una vista en la marcha para esta parte web y también aplicar la consulta en él.No me gustaría editar la vista original en la lista.

    ¿Alguna idea por favor?

¿Fue útil?

Solución

Entonces, lo resolví con mi ayuda de mi colega, en crear controles infantiles que hago seguir.Tome el esquema XML desde la vista, sobrescriba la consulta y pase a la vista de la lista.No se crea una nueva vista y todo funciona.

var obtainedList = elevatedWeb.GetListFromWebPartPageUrl(FullUrl);

if (obtainedList == null)
{
   throw new Exception(string.Format(ListFromUrlNotObtained,FullUrl));
}

FullUrl = HttpUtility.UrlDecode(FullUrl);

var listViewWebPart = new ListViewWebPart();
listViewWebPart.WebId = elevatedWeb.ID;
listViewWebPart.ListId = obtainedList.ID;//.ToString("B").ToUpper();

var obtainedListView =obtainedList.Views.OfType<SPView>().FirstOrDefault<SPView>(lv => FullUrl.EndsWith(lv.Url));

if (obtainedListView == null)
{
   throw new Exception(string.Format(ViewFromUrlNotObtained,FullUrl));
}

var html = obtainedListView.HtmlSchemaXml;

var xml = XElement.Parse(obtainedListView.HtmlSchemaXml);
xml.Attribute("Url").Remove();
xml.Element(XName.Get("Query")).SetValue(WildcardProcessor.ProcessQuery(FilterQuery));
var updatedXml = xml.ToString();

listViewWebPart.ListViewXml = updatedXml;

Controls.Add(listViewWebPart);

Otros consejos

Puede crear vista dinámicamente. No sé sobre "Cliente quiere mostrar solo elementos de lista en la parte web de la lista de listados en función del valor del perfil de usuario". Pero puede verificar su opinión llamada "ClientView" en la lista "ClientView", si se encuentra, elimínelo y cree una nueva vista con el mismo nombre para el usuario actual.

e.g.

SPList taskList = web.Lists[tasklistName];
                    string query = string.Empty;
                    if (taskList != null && taskList.ItemCount > 0)
                    {

                      query = "<OrderBy><FieldRef Name=\"Requirement_x0020_Details\" Ascending='TRUE'/></OrderBy><Where><Eq><FieldRef Name=\"Item_x0020_Type\"/><Value Type='Text'>Current</Value></Eq></Where>";

                    }
                    else
                    {
                        query = "<OrderBy><FieldRef Name=\"Requirement_x0020_Details\" Ascending='TRUE'/></OrderBy><Where><Eq><FieldRef Name=\"Task_x0020_Type\"/><Value Type='Text'>Current</Value></Eq></Where>";
                    }


                    StringCollection relevantColumns = CreateViewColumns();
                    SPView taskView = taskList.Views.Add("ClientView", relevantColumns, query, rowCount, true, false);

private StringCollection CreateViewColumns()
    {
        StringCollection viewFieldsCollection = new StringCollection();
        string tasksColumns = "Requirement_x0020_Details;DocIcon;LinkTitle;AssignedTo;Status;Priority;DueDate;PercentComplete";
        string[] columns = tasksColumns.Split(';');
        foreach (string column in columns)
        {
            viewFieldsCollection.Add(column);
        }
        return viewFieldsCollection;
    }

No estoy seguro de si esto cumple con sus requisitos, pero no, ¿no podría hacer esto fuera de la caja con la parte web del filtro de usuario actual?Expuesta los datos del perfil de usuario para el usuario actual, luego agregue una conexión a su lista y se filtrará.

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