【问题标题】:Use Code server-side scripting delimiters / ASP.NET inline expressions in none-ASP elements在非 ASP 元素中使用代码服务器端脚本分隔符/ASP.NET 内联表达式
【发布时间】:2017-09-08 09:42:25
【问题描述】:

我收到此错误消息:

无法从其字符串创建类型为“System.Boolean”的对象 'Visible' 属性的表示 。

当我尝试在我的 ASP.net 网站中运行此代码时:

<a runat="server" visible='<%: false %>' href="~/" >Home</a>

是否存在语法错误? false 应该可以被任何方法结果替换为:

<asp:Panel runat="server" Visible='<%: GetTrueOrFalse() %>'>Home</a>

【问题讨论】:

  • 查看我的更新答案,让我们总结一下!

标签: asp.net


【解决方案1】:

假设您有一个返回 bool 值的方法,如下所示:

public bool IsVisible()
{
    if (some_condition) // example condition test
    {
        return true;
    }
    else
    {
        return false;
    }
}

你需要像这样使用绑定:

ASPX

<a runat="server" visible='<%# IsVisible() %>' href="~/" >Home</a>

ASPX.CS(代码隐藏)

protected void Page_Load(object sender, EventArgs e)
{
    // do something

    Page.DataBind();
}

注意:此技巧适用于返回 bool 的方法或属性。

更新 1:

由于a标签没有设置任何id属性,你可以删除runat="server"

<a visible='<%# IsVisible() %>' href="~/" >Home</a>

或将 CSS 与 display: nonevisibility: hidden 一起使用:

<a visible='<%# IsVisible() %>' href="~/" style="visibility:hidden; display:none;">Home</a>

参考:

Is code rendering block <%=%> useful for boolean type?

【讨论】:

  • 那什么东西不会消失?请提供更多详细信息。
  • a 元素在我编写 public bool IsVisible() { return false; } 并将方法调用添加到 visible="" 时不会出现
  • 似乎runat="server" 可能会导致问题。尝试删除 runat 属性以将其设置为纯 HTML 标记。
【解决方案2】:

您还可以声明一个公共布尔值并使用它。如果链接在 GridView/Repetater 等之外,则需要使用 DataBind()

public bool isVisible = true;

protected void Page_Load(object sender, EventArgs e)
{
    DataBind();
}

现在你可以在 aspx 上使用它了。

<a runat="server" visible='<%# isVisible %>' href="~/">Home</a>

但是,您也可以在代码中使用基于不同变量或类值的三元运算符。

public int myValue = 11;
public Book myBook = new Book() { category = "Fantasy" };

protected void Page_Load(object sender, EventArgs e)
{
    DataBind();
}

现在您可以根据myValue 设置可见性,即使它不是布尔值。

<a runat="server" visible='<%# myValue > 10 ? true : false %>' href="~/">Home</a>

//or

<a runat="server" visible='<%# myBook.category == "Fantasy" ? true : false %>' href="~/">Home</a>

【讨论】:

  • 没有DataBind();方法可以调用
  • 是的。页面控件有这种方法(Page.DataBind()this.DataBind()DataBind() 相同)
【解决方案3】:

学习这项技术你会经常使用它。服务器端控件或容器可以很容易地在服务器端进行操作。如何?好吧,第一部分你做对了,你玩了它runat="server" 现在你所要做的就是给它一个 id,所以它看起来像这样让我们将 id 命名为 MyLink

<a runat="server" id="MyLink" href="~/" >Home</a>

-现在你注意到我已经删除了属性 Visible。是的,因为现在我们将在服务器端完全控制它。 假设您想第一次使用 hidden 开始页面,这很容易: 在您的页面加载事件中,我们将使用一种很好的技术来确定我们将编写的代码只会在第一次加载时运行一次。

    protected void Page_Load(object sender, EventArgs e)
    {

       //this condition means if is not post back (meaning the very first time only)

        if(!IsPostBack)
          {
            MyLink.Visible = false;
          }
    } 

现在你明白了,你可以简单地让你的控件在任何你想要的地方再次可见

MyLink.Visible = true; 

然后完成。如果您需要更多帮助,请告诉我!

如果你想内联,它是一个字符串值而不是布尔值,所以你应该用双引号括起来 visible='&lt;%: "false" %&gt;'

【讨论】:

    【解决方案4】:

    使用&lt;%: ... %&gt; 语法会引发上述解析器错误。数据绑定服务器控制值的正确语法是&lt;%# ... %&gt;Inline expression's more detail is here.


    你可以用另一种方式做到这一点:

    <% if(GetTrueOrFalse()) { %>
        <a ID="alink" runat="server" href="~/" >Home</a>
        //... other code
    <% } %>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-10
      • 1970-01-01
      • 2014-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多