从<%:...%>动态添加HTML我正在从代码隐藏中修改其父级的图像

时间:2017-03-10 17:51:00

标签: c# asp.net .net

我正在尝试做一些与this question类似的事情。那里的答案建议从代码隐藏中进行数据绑定,但是我有很多项目我都应用这个,如果可能的话我宁愿不这样做。

我有一个用户控件。根据自定义控件上的属性值,将显示或隐藏许多图像。我已经尝试了几种使用<%: ... %>语法实现此目的的不同方法,但由于我将在下面描述的原因,所有这些方法都失败了。

我的第一次尝试是在链接问题上执行类似OP的操作。从他的问题:

<select id="myDropDown" 
        style="width:60px;display:<%# (bool)Eval("ShowDropDown") ? "block" : "none" %>;">

我尝试了类似的东西,但是就像OP一样,它没有用值替换<%# (bool)Eval("ShowDropDown") ? "block" : "none" %> - 它只是将其作为文字文本呈现。

我接下来试过的事情(我已尝试过几种变体,其中没有一种变得有效)如下:

<td id="tdR1Day1" style="vertical-align: top;" runat="server">
            <div style="width: 100%; height: 15px">
                <img title="Click to add pattern" <%: IsHidden ? "hidden = \"hidden\"" : "" %> align="right" id="imgR1Day1" style="cursor: pointer;" alt="Add" src="../Images/Add.gif">
            </div>
        </td>

但是,这导致The Controls collection cannot be modified because the control contains code blocks (i.e. <% ... %>),因为我试图从后面的代码向div标记动态添加td。我没有直接修改img本身,只是 td

当我在图像上执行完全相同的操作时,我从代码隐藏中进行修改时,我得到以下HTML,它完全符合我的预期:

<td id="MainContent_scorpio_tdR1Day3" style="vertical-align: top;">
            <div style="width: 100%; height: 15px">
                <img hidden = &quot;hidden&quot; title="Click to add pattern" align="right" id="imgR1Day3" style="cursor: pointer;" alt="Add" src="../Images/Add.gif">
            </div>
        </td>

我的问题,然后:

  • 当我尝试将此作为CSS的一部分时,为什么将其渲染为文字文本而不是用值替换<%: ... %>
  • 围绕The Controls collection cannot be modified...例外吗?

或者,我是不是采取了错误的做法?例如,我是否应该尝试从代码隐藏中添加此div / image,就像我在div中使用其他td一样?

1 个答案:

答案 0 :(得分:1)

有几个问题。 <%# ... %>用于绑定到服务器控件的数据。您的<select>不是服务器控件。使用<%= ... %>用于显示表达式,只需调用一个函数。有关内联表达式的更多信息,请参阅here

假设IsHidden是一个布尔变量,你可以这样做:

<script runat="server">
    protected string Display()
    {
        if (IsHidden) {
            return "hidden";
        }
        return "show";
    }
</script>

<select id="myDropDown" style='display:<%= Display  %>'>
    <option>
        Test
    </option>
</select>

我还建议只使用CSS类。所以更像是

<style>
    .hidden {display:none;}
    .show {display:block;}
</style>

<script runat="server">
    protected string Display()
    {
        if (IsHidden) {
            return "hidden";
        }
        return "show";
    }
</script>

<select id="myDropDown" class="<%= Display %>">
    <option>
        Test
    </option>
</select> 


但是如果你想在后面的代码中修改你的表行,你应该确实使用数据绑定内联表达式,例如<%# ... %>并且其余部分仍然如此。这将解决您的Controls collection例外情况。