代码之家  ›  专栏  ›  技术社区  ›  Anders

显示生成的文本时出现<%:…%>vs.<%=%>

  •  1
  • Anders  · 技术社区  · 14 年前

    我正在用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 回复  |  直到 14 年前
        1
  •  4
  •   Marc Gravell    14 年前

    因为 <%: 意在 编码 用户输入等数据。在您的情况下,这是自生成(可信)的HTML,因此您不 希望 编码; <%= 是正确的用法。

    <%: 是为了像 <%:user.Name%> 这可以方便地防止包含XSS等的恶意文本出现问题。

        2
  •  0
  •   Nick Larsen    14 年前

    当值不是时,可以让类为空 Home . 很明显,你试图把这一切都忽略掉,但这将是一个解决方案。

    const string current = "current_page";
    <li class="<%: (oController.Equals("Home") ? current : "") %>"><a href="/">Home</a></li>