【问题标题】:Is there a way to data bind a single item without eg. a Repeater control?有没有一种方法可以在没有例如数据的情况下绑定单个项目。中继器控件?
【发布时间】:2010-09-18 12:34:09
【问题描述】:

假设我有一个 Car 类型的对象,我想将其呈现为 HTML:

class Car {
  public int Wheels { get; set; }
  public string Model { get; set; }
}

我不想使用 ASP.NET Repeater 或 ListView 控件进行绑定,因为它看起来太冗长了。我只有一个对象。但我仍然希望能够使用数据绑定语法,因此我不必使用标签或文字。比如:

<div>
  Wheels: <%# (int)Eval("Wheels") %><br />
  Model: <%# (string)Eval("Model") %>
</div>

有没有人知道有一个控件可以做到这一点?

我还没有准备好切换到 ASP.NET MVC。


不幸的是,DetailsView 控件不能满足我的需求,因为它似乎不支持我所追求的模板样式语法。它也需要绑定到某种类型的 DataSource 对象。

我更喜欢 Maxim 和 Torkel 建议的解决方案。我会努力争取的。

【问题讨论】:

    标签: c# asp.net webforms


    【解决方案1】:

    如果页面是关于特定项目的(例如,Car.aspx?CarID=ABC123),我通常在页面上有一个名为“CurrentCar”的公共属性

    public Car CurrentCar { get; set; }
    

    然后我可以拥有以下内容:

    <div>
      Wheels: <%= CurrentCar.Wheels %><br />
      Model: <%= CurrentCar.Model %>
    </div>
    

    这让你有类型安全。只需确保在实际渲染之前分配了一个有效的对象即可。

    【讨论】:

    • 虽然您可能想在显示此标记之前在此处检查 CurrentCar 是否为空。
    • 我会将属性设为“受保护”而不是“公开”,除非我有理由将其公开给其他类(当然,除了像 ASPX 页面这样的子类。)
    【解决方案2】:

    我建议您在页面上将 car 设为受保护的属性,这样您就可以直接在 aspx 页面中访问它:

    <div>
      Wheels: <%= Car.Wheels %>
      Wheels: <%= Car.Models %>
    </div>
    

    这种方法实际上更适合单项数据绑定方案,因为“绑定”是强类型的。

    【讨论】:

    • 车轮和车轮。 :P 你有一个错字。
    【解决方案3】:

    受保护的属性解决方案的一个缺点是您不能使用它来绑定控件的属性。

    例如,以下将不起作用:

    <asp:Label ID="Label1" Text="Probably a truck" Visible='<%# CurrentCart.Wheels > 4 %>' runat="server" />
    

    【讨论】:

    • 为什么要保护它?在这种情况下,public 更好,因为 99.99% 的时间,您不会从其他地方的页面继承。当然,框架可以,但是……就是这样。
    • 这正是我希望它受到保护的原因...... :)
    • 实际上它确实可以使用上面的
    猜你喜欢
    • 2011-09-30
    • 2018-09-10
    • 1970-01-01
    • 1970-01-01
    • 2010-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-01
    相关资源
    最近更新 更多