使用Eval调用方法而不是属性
本文关键字:属性 方法 Eval 调用 使用 | 更新日期: 2023-09-27 18:14:44
示例:
我可以访问ID
属性,因为有一个属性。
但我不能访问同一类中的方法。所以<%# Eval("GetToday") as string %>
不起作用。创建一个属性而不是一个没有setter的方法可以解决问题,但有更好的方法吗?
标记:
<asp:GridView ID="GridView1" runat="server" SelectMethod="GetMyClass">
<Columns>
<asp:TemplateField HeaderText="ID">
<ItemTemplate>
<%# Eval("ID") as string %>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Today">
<ItemTemplate>
<%# Eval("**GetToday**") as string %>
</ItemTemplate>
</asp:TemplateField>
</Columns>
代码背后:
public IList<MyClass> GetMyClass() { return new List<MyClass>(); }
MyClass:
public class MyClass {
public int ID { get; set; }
public DateTime Date { get; set; }
public string GetToday()
{
// other userfulls logic
return Date.ToString("dd.MM.yyyy");
}
// workaround
public string GetTime
{
get
{
return Date.ToString("HH:mm");
}
set
{
// nothing
}
}
}
不,没有。ASP。NET Databinder.Eval
方法只支持属性表达式,如MSDN(emphasis mine(中所述:
从容器对象到公共属性值的导航路径
除了您已经发现的属性之外,方法调用没有其他选择。
您最好使用现有的DateTime Date
属性,并应用一些文本格式:
<asp:GridView ID="GridView1" runat="server" SelectMethod="GetMyClass">
<Columns>
<asp:TemplateField HeaderText="ID">
<ItemTemplate>
<%# Eval("ID") as string %>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Today">
<ItemTemplate>
<%# Eval("Date", "{0:dd.MM.yyyy}") %>
</ItemTemplate>
</asp:TemplateField>
</Columns>
如果您必须具有自定义逻辑,那么您可以在属性中执行此操作,而不是使用方法,例如:
public class MyClass {
public int ID { get; set; }
private DateTime _date;
public DateTime Date
{
get
{
//do something with the date field here
// you could add a number of days for example
_date = _date.AddDays(4);
return _date;
};
set
{
_date = value;
};
}
public MyClass()
{
_date = DateTime.Now();
}
}
只要确保私有_date
字段初始化正确,也许在MyClass
的构造函数中,我已经在示例中将其初始化为当前日期。
您可以调用一个方法,只需获得正确的语法:
<%= GetToday() %>
如果get访问器像您的示例一样简单,那么您可以用它创建一个属性,这是正确的。
正如philreed所指出的,如果你只是格式化DateTime,那么你可以在现有属性上使用Eval:
<%# Eval("Date", "{0:dd.MM.yyyy}") %>
但是,如果该方法正在做更复杂的事情,那么我会避免将复杂的逻辑放入属性中。相反,您可以在页面代码后面调用一个方法,然后调用类的方法:
<asp:TemplateField HeaderText="Today">
<ItemTemplate>
<%# GetToday(Container.DataItem) %>
</ItemTemplate>
</asp:TemplateField>
然后在后面的代码中:
protected string GetToday(object obj)
{
MyClass mc = obj as MyClass;
if(mc != null) return mc.GetToday();
else return "Some default text.";
}
不是最优雅的解决方案,但如果没有其他选择,也可以使用。