我正在用C#编写MVC应用程序。在这个特定的部分中,我有一个条件开关,用于导航以突出显示相应的选项卡。这是代码:
<script type="text/C#" runat="server">
string oController;
string oAction;
const string current = "class=\"current_page\"";
protected override void OnLoad(EventArgs e)
{
oController = ViewContext.RouteData.Values["controller"].ToString();
oAction = ViewContext.RouteData.Values["action"].ToString();
base.OnLoad(e);
}
</script>
<div id="menu">
<ul>
<li <%= (oController.Equals("Home") ? current : "") %>><a href="/">Home</a></li>
<li><a href="/CustomerManager/">Customer Manager</a></li>
<!-- <%: oController.Equals("Home") %> -->
<!-- <%: oAction %> -->
</ul>
</div>
在这一行( <li <%= (oController.Equals("Home") ? current : "") %>><a href="/">Home</a></li>
),如果我使用<%: %>
ASP块而不是<%= %>
(建议使用,因为后者正在逐步淘汰很快),生成的文本显示为
<li class="current_page"><a href="/">Home</a></li>
而不是
<li class="current_page"><a href="/">Home</a></li>
为什么会发生这种情况的任何建议和/或原因?谢谢!
答案 0 :(得分:4)
因为<%:
旨在编码数据,例如用户输入。在您的情况下,这是自生成(受信任)的html,因此您不希望对其进行编码; <%=
是正确的用法。
<%:
适用于<%:user.Name%>
之类的内容,可以方便地防止包含xss等恶意文本的问题。
答案 1 :(得分:0)
当值不是Home
时,您可以将该类设为空。很明显,你试图将它们全部省略,但它仍然是一个解决方案。
const string current = "current_page";
<li class="<%: (oController.Equals("Home") ? current : "") %>"><a href="/">Home</a></li>