Domanda

Il nostro cliente ci ha chiesto di modificare il filtro della visualizzazione elenco per non mostrare tutti i termini della tassonomia nei metadati gestiti, ma solo quelli dei documenti nella libreria.

Attualmente abbiamo due colonne:

Abbiamo una colonna di metadati gestiti popolata dalla tassonomia dei termini.Quando si utilizza un filtro sulla colonna sono visibili tutti i valori della tassonomia.

image1

Abbiamo anche una colonna di definizione del campo personalizzato che eredita da TaxonomyField che nella visualizzazione filtro mostra solo i valori dei documenti esistenti in una libreria.

image2

Ho provato a trovare il modo di fornire questo filtraggio.Dopo la ricerca sembra che non esista un modo semplice per eseguire questa operazione per la colonna di metadati gestiti.Anche guardare la rete non ha dato risposte conclusive.Ho trovato solo un posto in cui qualcuno ha posto la stessa domanda, ma le risposte non sono soddisfacenti per il mio caso.

Filtraggio della visualizzazione elenco sui campi di metadati gestiti

È stato utile?

Soluzione

Finalmente siamo riusciti a risolvere il problema.In breve, per funzionare è necessario modificare il modo in cui funziona il codice del filtro OOTB in modo che pensi di funzionare con SPFieldLookup.

Per raggiungere questo obiettivo sono necessari 3 passaggi.

1.Creare una copia del file Filter.aspx situato nella directory principale di Sharepoint.Questo aspx è responsabile del rendering degli elementi nella visualizzazione filtrata.2.Crea HttpModule per reindirizzare le richieste al customFilter.3.Registra il HttpModule creato in webconfig.

  1. Sostituisci la classe FilterAspxPage (il codice è in Microsoft.Sharepoint.ApplicationPages.dll) utilizzata in questo file aspx con un'implementazione personalizzata, che dovrebbe assomigliare a questa:

    public partial class CustomFilter : Microsoft.SharePoint.ApplicationPages.FilterAspxPage
    {   
        protected new void GetDistinctValues()
        {
        // exact copy of the method GetDistinctValues from Microsoft.Sharepoint.ApplicationPages.dll with code taken from OnInit method
        // to properly initialize objects used in this method
        // Also one use of reflection was needed, because renderAsHtml is protected
    
        // after assignment to text4 string we've added this condition:
    
        if (text4.Equals("Microsoft.SharePoint.Taxonomy.TaxonomyField", StringComparison.InvariantCultureIgnoreCase) == true)
        {
            text4 = "Microsoft.SharePoint.SPFieldLookup";
        }
      }
    }
    
  2. Ecco un esempio di come creare HttpModule personalizzato:

    public class ListFilterRedirectModule : IHttpModule
    {
    
    #region IHttpModule Members
    
        public void Dispose()
        {
        }
    
        public void Init(HttpApplication context)
        {
            context.BeginRequest += new EventHandler(context_BeginRequest);
        }
    #endregion
    
    
        private void context_BeginRequest(object sender, EventArgs e)
        {
            HttpApplication application = (HttpApplication)sender;
            HttpContext context = application.Context;
    
            if (context.Request.RawUrl.IndexOf("/_layouts/filter.aspx", StringComparison.InvariantCultureIgnoreCase) >= 0)
            {
                string newUrl = context.Request.Url.Scheme+"://"+context.Request.Url.Host + context.Request.RawUrl.Replace("/_layouts/filter.aspx", "/_layouts/CustomFilter.aspx");
                context.Response.Redirect(newUrl);
            }
        }
    
    }
    
  3. Dovrai configurare questo modulo nel file web.config del tuo sito web e registrarlo con IIS prima di poterlo utilizzare.Per ulteriori informazioni sull'intero processo consultare il seguente collegamento: http://go.microsoft.com/?linkid=8101007.Di seguito sono riportate le righe di esempio che è possibile aggiungere al file web.config:

    <system.webServer>
        <modules runAllManagedModulesForAllRequests="true">
            <add name="ListFilterRedirectModule" type="ListFilterRedirectModule, ... , Version=1.0.0.0, Culture=neutral, PublicKeyToken=..." />
        </modules>
    </system.webServer>
    

Altri suggerimenti

È possibile utilizzare questa soluzione da Codeplex: http://metadatapagefilter.codeplex.com/ Ha abbastanza limitazioni (la colonna deve esistere come sito di root, limitato ai set termini con un unico livello ...) ma forse può aiutarti.

Leggi le discussioni Se stai usando IE8 o 9 poiché indica come lavorare attorno a una situazione di caricamento infinita.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a sharepoint.stackexchange
scroll top