SiteMap, query string si editare ulterioara

 

Am avut de facut , de multe ori, site-uri care cuprindeau pagini de genul : Lista, Editare, Editare proprietati ( de ex., Lista User ( cu cautare + sortare), Editare User, Editare Proprietati UserCurent).Problema intervine cind vrei sa ii lasi si un site map – si ai urmatoarea structura : Lista User-i => Editare User => Editare proprietati user si , dupa ce user-ul este pe pagina de editare proprietati, revine la Editare User – de unde stii ce user ai editat ? De obicei pasezi id-ul in query string …dar cum il pui in sitemap ?

Solutia rapida pe care o gasisem(nu foarte corecta, dar rapida ) a fost sa tin in Session ultimul user care este editat.Nu prea mi-a placut – mult de scris, de repetat.

Ma uitasem si la pagina aceasta, de modificat nodurile in memorie, dar iar nu mi-a placut.

Simteam ca trebuie sa fie ceva in XMLProvider … dar nu reuseam sa ii dau de cap.

Dupa mult timp, am dat de pagina asta

http://www.csharper.net/blog/custom_sitemapprovider_incorporates_querystring_reliance.aspx

care mi-a rezolvat problema, prin mostenire de la XMLSiteMapProvider.

Ce trebuie sa faceti :

 

  1. Sau de aici

public class SmartSiteMapProvider : XmlSiteMapProvider

{

    public override void Initialize(string name, NameValueCollection attributes)

    {

        base.Initialize(name, attributes);

        this.SiteMapResolve += new SiteMapResolveEventHandler(SmartSiteMapProvider_SiteMapResolve);

    }

 

    SiteMapNode SmartSiteMapProvider_SiteMapResolve(object sender, SiteMapResolveEventArgs e)

    {

        if(SiteMap.CurrentNode == null)

            return null;

 

        SiteMapNode temp;

        temp = SiteMap.CurrentNode.Clone(true);

        Uri u = new Uri(e.Context.Request.Url.ToString());

 

        SiteMapNode tempNode = temp;

        while(tempNode != null)

        {

            string qs = GetReliance(tempNode, e.Context);

            if(qs != null)

                if(tempNode != null)

                    tempNode.Url += qs;

 

            tempNode = tempNode.ParentNode;

        }

 

        return temp;

    }

 

    private string GetReliance(SiteMapNode node, HttpContext context)

    {

        //Check to see if the node supports reliance

        if(node["reliantOn"] == null)

            return null;

 

        NameValueCollection values = new NameValueCollection();

        string[] vars = node["reliantOn"].Split(",".ToCharArray());

 

        foreach(string s in vars)

        {

            string var = s.Trim();

            //Make sure the var exists in the querystring

            if(context.Request.QueryString[var] == null)

                continue;

 

            values.Add(var, context.Request.QueryString[var]);

        }

 

        if(values.Count == 0)

            return null;

 

        return NameValueCollectionToString(values);

    }

 

    private string NameValueCollectionToString(NameValueCollection col)

    {

        string[] parts = new string[col.Count];

        string[] keys = col.AllKeys;

 

        for(int i = 0; i < keys.Length; i++)

            parts[i] = keys[i] + "=" + col[keys[i]];

 

        string url = "?" + String.Join("&", parts);

        return url;

    }

}

(inca o data: nu e codul meu, ci al lui C# Shiznit,http://www.csharper.net/blog/custom_sitemapprovider_incorporates_querystring_reliance.aspx)

 

  1. Puneti in web.config urmatoarele:

    <siteMap defaultProvider=”SmartSiteMapProvider” enabled=”true”>
    <providers>
    <clear />
    <add name=”SmartSiteMapProvider” type=”SmartSiteMapProvider” siteMapFile=”web.sitemap” securityTrimmingEnabled=”true” />
    </providers>
    </siteMap>

     

  2. In web.sitemap folositi reliantOn

    <siteMapNode url=”~/EditUser.aspx” title=”Editare utilizator” reliantOn=”UserID” />

     

  3. GATA!

 

Ce mai poate fi facut ? Poate sa ia nu doar din QueryString, ci si din Form.

 

One thought on “SiteMap, query string si editare ulterioara

  1. Salut, am ajuns la blogul tau cautand info despre vacante. Am vazut lucruri interesante, pe care as vrea sa le mentionez pe site-ul meu, dedicat in intregime acestui subiect, http://www.AmFostAcolo.ro. In acest moment implementez o sectiune cu numele [provizoriu] "Blog Vacante" in care sa listez bloguri care mi-au atras mie atentia pe acest subiect. Daca consideri util ca blogul tau sa apara acolo, te rog contacteaza-ma pe adresa de mail cornel [@] amfostacolo.ro.

Leave a Reply

Your email address will not be published. Required fields are marked *