<%:...%>的问题与<%=%>显示生成的文本时

时间:2010-09-09 20:52:05

标签: c# asp.net-mvc

我正在用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=&quot;current_page&quot;><a href="/">Home</a></li> 

而不是

<li class="current_page"><a href="/">Home</a></li>

为什么会发生这种情况的任何建议和/或原因?谢谢!

2 个答案:

答案 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>