/ / मैं एस्प के आउटपुट को कैसे बदल सकता हूं: साइटमैपपठ एक सूची में? - .net, vb.net

मैं एएसपी के आउटपुट को कैसे बदल सकता हूं: SiteMapPath एक सूची में? --नेट, vb.net

मैं .NET और VB.NET दोनों के साथ बहुत अपरिचित हूँ और यह कैसे करना है, यह पता लगा सकता हूँ। कहो कि मेरे पास इस तरह का कोड है:

<div class="breadcrumb">
<asp:SiteMapPath ID="SiteMapPath1" runat="server"></asp:SiteMapPath>
</div>

यह का एक गुच्छा आउटपुट <span>के साथ > विभाजक के रूप में, कुछ इस तरह से:

<div class="breadcrumb">
<span id="ctl00_SiteMapPath1">
<a href="#ctl00_SiteMapPath1_SkipLink">
<img alt="Skip Navigation Links" height="0" width="0" src="/images//Bonfield/WebResource.axd?d=PEpmmIw6qvhaEC3hEwXGjgvJKlzc3DOMu_e-zW-n6pfl6YR-iYjwmlvrYPb689EslKxysA7aoh_x_ALjLs5QXiz7NG41&amp;t=634245478914809245" style="border-width:0px;" />
</a>
<span>
<a href="/Bonfield/Default.aspx">Home</a>
</span>
<span> &#187; </span>
<span>Showcase</span><a id="ctl00_SiteMapPath1_SkipLink"></a></span>
</div>

मैं इसे कैसे सूची में बदल सकता हूं:

<ul>
<li>Home</li>
<li>Showcase</li>
</ul>

उत्तर:

जवाब के लिए 2 № 1

आपने अब तक इसे हल कर लिया होगा, लेकिन आप इस फ़ंक्शन का उपयोग किसी साइटमैप और उनके वंशजों के रूटनोड में सभी आइटम्स के माध्यम से लूप करने के लिए कर सकते हैं और नेस्टेड सूची बना सकते हैं।

आप हटा सकते हैं If item.HasChildNodes Then sb.Append(ListChildNodes(item)) यदि आप केवल शीर्ष स्तर में रुचि रखते हैं

 Public Function SiteMap() As String
Return ListChildNodes(System.Web.SiteMap.RootNode)
End Function

Private Function ListChildNodes(ByVal node As System.Web.SiteMapNode) As String
Dim sb As New System.Text.StringBuilder

sb.Append("<ul>")
For Each item As SiteMapNode In node.ChildNodes
sb.Append(String.Concat("<li><a href=""", item.Url, """>", item.Title, "</a></li>"))
If item.HasChildNodes Then sb.Append(ListChildNodes(item))
Next
sb.Append("</ul>")

Return sb.ToString
End Function

उन लोगों के लिए जो C # संस्करण को पसंद करेंगे:

public string SiteMap()
{
return ListChildNodes(System.Web.SiteMap.RootNode);
}
private string ListChildNodes(System.Web.SiteMapNode node)
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();

sb.Append("<ul>");
foreach (SiteMapNode item in node.ChildNodes)
{
sb.Append(string.Concat("<li><a href="", item.Url, "">", item.Title, "</a></li>"));
if (item.HasChildNodes)
sb.Append(ListChildNodes(item));
}
sb.Append("</ul>");

return sb.ToString();
}

तब आपके कोड में आप पृष्ठ पर स्ट्रिंग को आउटपुट करने के लिए कॉल कर सकते हैं।

<h1>Site Map</h1>
<%=SiteMap()%>
</div>

जवाब के लिए 2 № 2

हालांकि आप "स्पैन टैग्स से छुटकारा नहीं पा सकते हैं, आप कर सकते हैंजो चाहो पूरा करो। मैं इसी मुद्दे में भाग गया क्योंकि मैं एक खरीदे गए सीएसएस / एचटीएमएल साइट टेम्पलेट का उपयोग कर रहा था जिसे ग्राहक चाहता था, लेकिन पूरी बात आधारित थी <ul>"रेत <li>"सीएसएस को फिर से भरना बहुत दर्दनाक होता, इसलिए मुझे यह समाधान मिला जिसने सीएसएस कोड में कोई भी बदलाव किए बिना अच्छी तरह से काम किया।

आप दो काम करेंगे:

  1. डिफ़ॉल्ट नोड टेम्पलेट का उपयोग करने वाले के साथ ओवरराइड करें <li> टैग
  2. पूरी चीज़ को एक में लपेटें <ul> टैग

यहां एक उदाहरण है:

<ul style="list-style-type: none;">
<asp:SiteMapPath ID="SiteMapPath1" runat="server" >
<NodeTemplate>
<li>
<a href="<%# Eval("url") %>" title="<%# Eval("description") %>"><%# Eval("title") %></a>
</li>
</NodeTemplate>
</asp:SiteMapPath>
</ul>

जवाब के लिए 0 № 3

निकटतम मैं सोच सकता हूँ कि आप साइटमैप को एक में डाल रहे हैं <asp:menu> नियंत्रण। हालांकि यह html तालिका के रूप में आउटपुट करेगा, लेकिन नेत्रहीन यह एक सूची दिखाएगा:

<asp:Menu ID="leftNavigation" runat="server" DataSourceID="SiteMapDataSource1"
StaticDisplayLevels="1" MaximumDynamicDisplayLevels="1">
</asp:Menu>
<asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" ShowStartingNode="false" />

अपने इच्छित आउटपुट पाने के लिए सभी स्टाइलिंग और फ़ॉर्मेटिंग विकल्पों के साथ खेलें। यहाँ देखें एक विस्तृत पूर्वाभ्यास के लिए।

ओह, और निश्चित रूप से आप इसके बजाय साइटमैप के साथ ट्रीव्यू का उपयोग कर सकते हैं (एक ही पृष्ठ देखें)


जवाब के लिए 0 № 4

जबकि थोड़ा सा शामिल है, यह एक समाधान है जो वास्तव में स्पैन को हटा देता है और एक स्वच्छ सूची प्रदान करता है।

सबसे पहले, उन अतिरिक्त अंतराल से छुटकारा पाएं जिन्हें संशोधित करके SiteMapPath। मैंने एक वर्ग निकाला है NakedSiteMapPath ऐसा करता है। यदि आवश्यक हो तो यह अभी भी टेम्पलेट्स में स्पष्ट स्पैन के उपयोग की अनुमति देता है:

/// <summary>
///     A SiteMapPath, that does not render span elements.
/// </summary>
/// <remarks>
///     To still allow explizit spans inside the node templates, immediately prefix the opening and closing span elements
///     with the literal
///     prefix "<!--KEEP NEXT SPAN-->" (without the double quotes)
///     Example:
///     <code>
///     <PathSeparatorTemplate><!--KEEP NEXT SPAN--><span class="icon icon--greater"><!--KEEP NEXT SPAN--></span>
///         </PathSeparatorTemplate>
/// </code>
///     Those spans (opening and closing) will be kept, but the prefix removed in the rendered output.
/// </remarks>
/// <devdoc>
///     The MSDN doc has a nice example about a customized breadcrumb with a dropdown menu here:
///     https://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.sitemappath%28v=vs.110%29.aspx
/// </devdoc>
[AspNetHostingPermission(SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Minimal)]
[ToolboxData("<{0}:NakedSiteMapPath runat=server></{0}:NakedSiteMapPath>")]
public class NakedSiteMapPath : SiteMapPath {
/// <summary>
///     Outputs server control content to a provided <see cref="T:System.Web.UI.HtmlTextWriter" /> object and stores
///     tracing information about the control if tracing is enabled.
/// </summary>
/// <param name="writer">The <see cref="T:System.Web.UI.HtmlTextWriter" /> object that receives the control content.</param>
public override void RenderControl(HtmlTextWriter writer) {
//Render to a local string, then remove all unnecessary spans
StringBuilder myStringBuilder = new StringBuilder();
TextWriter myTextWriter = new StringWriter(myStringBuilder);
HtmlTextWriter myWriter = new HtmlTextWriter(myTextWriter);
base.RenderControl(myWriter);

string html = myStringBuilder.ToString();

//Remove all spans, except those opening and closing spans wich have been marked with the literal comment "<!--KEEP NEXT SPAN-->"
const string matchOpenExceptSkipPrefix = @"(?<!<!--KEEP NEXT SPAN-->)<span>";
const string matchCloseExceptSkipPrefix = @"(?<!<!--KEEP NEXT SPAN-->)</span>";
html = Regex.Replace(html, matchOpenExceptSkipPrefix, String.Empty);
html = Regex.Replace(html, matchCloseExceptSkipPrefix, String.Empty);
html = html.Replace(@"<!--KEEP NEXT SPAN-->", String.Empty);

//finally, write the naked html out.
writer.Write(html);
}
}

इसके साथ, स्पैन चले गए हैं। कस्टम लिंक करने के लिए, जैसे li तत्वों, आपको टेम्प्लेट का उपयोग करने की आवश्यकता होगी, क्योंकि अन्य पहले से ही प्रस्तावित हैं। यहाँ एक उदाहरण ASPX पृष्ठ भाग के साथ है NakedSiteMapPath:

<ol class="breadcrumb" role="navigation" aria-labelledby="pagebreadcrumbs">
<my:NakedSiteMapPath runat="server"
PathDirection="RootToCurrent"
RenderCurrentNodeAsLink="False">
<PathSeparatorTemplate><!--KEEP NEXT SPAN--><span class="icon icon--greater"><!--KEEP NEXT SPAN--></span></PathSeparatorTemplate>
<CurrentNodeTemplate>
<li class="active" aria-selected="true">
<asp:Literal
Text="<%# Eval("Title") %>"
runat="server" />
</li>
</CurrentNodeTemplate>
<NodeTemplate>
<li>
<asp:HyperLink
ID="lnkPage"
Text="<%# Eval("Title") %>"
NavigateUrl="<%# Eval("Url") %>"
ToolTip="<%# Eval("Description") %>"
runat="server" />
</li>
</NodeTemplate>
</my:NakedSiteMapPath>
</ol>

उत्तर के लिए -1 № 5

इसके लिए सबसे अच्छा विकल्प टेम्प्लेट का उपयोग करने के लिए SiteMapPath में कनवर्ट करना है।

में <NodeTemplate> आप रख सकते हैं <li> आपके द्वारा आवश्यक प्रारूप वाले तत्व। में <PathSeparatorTemplate> आप विभाजक रख सकते हैं।

के साथ SiteMapPath नियंत्रण लपेटें <ul> टैग और इसे करना चाहिए।

उदाहरण:

 <ul class="breadcrumb">
<asp:SiteMapPath ID="SiteMapPath1" PathSeparator="" runat="server">
<NodeTemplate>
<li>
<a href="<%# Eval("url") %>" title="<%# Eval("description") %>"><%# Eval("title") %></a>
</li>
</NodeTemplate>
<PathSeparatorTemplate>
<span class="divider">/</span>
</PathSeparatorTemplate>
</asp:SiteMapPath>
</ul>

बूटस्ट्रैप और ASP.NET का उपयोग करते समय यह उत्कृष्ट विकल्प है