有没有一种方法可以在没有 Repeater 控件的情况下绑定单个项的数据?

19

假设我有一个类型为Car的单一对象,我想将其渲染成HTML:

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

我不想使用ASP.NET的Repeater或ListView控件进行绑定,因为它们看起来太冗长。我只有一个对象。但我仍然想要使用数据绑定语法,这样我就不需要使用Labels或Literals。类似于:

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

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

而我现在还不准备切换到ASP.NET MVC。


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

我更喜欢Maxim和Torkel建议的解决方案。我会尝试去做。

3个回答

26

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

public Car CurrentCar { get; set; }

那么我接下来可以有以下内容:

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

这可以让您拥有类型安全性。只需确保在实际呈现之前分配一个有效的对象。


在显示此标记之前,您可能需要检查CurrentCar是否为空。 - rjarmstrong
我会将属性设置为“protected”,除非我有理由将其暴露给其他类(当然,除了像 ASPX 页面这样的子类)。 - JMD

5
我建议您将车辆设置为页面上的受保护属性,这将允许您在aspx页面中直接访问它:
<div>
  Wheels: <%= Car.Wheels %>
  Wheels: <%= Car.Models %>
</div>

这种方法实际上更适用于单个数据绑定场景,因为“绑定”是强类型的。


你打错字了,应该是 Wheels and Deals. :P - Maxime Rouiller

0

使用受保护的属性解决方案的一个缺点是,您无法将其绑定到控件的属性。

例如,以下内容将无法正常工作:

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

为什么要进行保护?在这种情况下,public更好,因为99.99%的时间里,您不会从其他地方继承页面。当然,框架会这样做,但是...就是这样。 - Maxime Rouiller
1
这正是我希望它受到保护的原因... :) - JacobE
实际上,它确实可以与上面的<%#数据绑定语法一起使用...我最初遇到了另一个问题,导致它无法正常工作。 - JacobE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接