/ /どうすればasp:SiteMapPathの出力をリストに変換できますか? -.net、vb.net

asp:SiteMapPathの出力をリストに変えるにはどうすればいいですか? - .net、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>

回答:

回答№1は2

これで解決できたかもしれませんが、この関数を使用して、サイトマップのルートノードとその子孫のすべてのアイテムをループし、ネストされたリストを作成できます。

あなたは削除することができます 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

スパンタグを取り除くことはできませんが、あなたが望むものを達成します。クライアントが望んでいた購入済みのCSS / HTMLサイトテンプレートを使用していたので、これと同じ問題に遭遇しましたが、すべてが <ul>"砂 <li>「s。CSSのリファクタリングはあまりにも面倒だったので、CSSコードを変更せずにうまく機能するこのソリューションを見つけました。

次の2つのことを行います。

  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>

回答№3の場合は0

私が考えることができる最も近いものはあなたにサイトマップを置くことです <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" />

すべてのスタイリングとフォーマットのオプションをいじって、目的の出力を取得してください。 ここをクリック 詳細なチュートリアルについては、

ああ、もちろん、代わりにサイトマップでツリービューを使用することも検討できます(同じページを参照)。


回答№4の場合は0

少し複雑ですが、これは実際にスパンを削除してクリーンなリストをレンダリングするソリューションです。

最初に、これらの余分なスパンを変更して、 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>

回答№5の場合は-1

これに最適なオプションは、テンプレートを使用するように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>

これは、BootstrapとASP.NETを使用する場合の優れたオプションです。