使用 Eval 调用方法而不是 属性
Call methods instead of property with Eval
示例:
我可以访问 ID
属性 因为有 属性.
但我无法从同一个 class 访问方法。所以 <%# 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>(); }
我的班级:
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 (强调我的)中所述:
The navigation path from the container object to the public property value
除了您已经发现的属性之外,没有其他方法调用方法。
您最好使用现有的 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}") %>
但是如果该方法正在做一些更复杂的事情,那么我会避免将复杂的逻辑放在 属性 中。相反,您可以在页面代码后面调用一个方法,然后调用您的 class 的方法:
<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.";
}
不是最优雅的解决方案,但如果没有其他选择,可以使用。
示例:
我可以访问 ID
属性 因为有 属性.
但我无法从同一个 class 访问方法。所以 <%# 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>(); }
我的班级:
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 (强调我的)中所述:
The navigation path from the container object to the public property value
除了您已经发现的属性之外,没有其他方法调用方法。
您最好使用现有的 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}") %>
但是如果该方法正在做一些更复杂的事情,那么我会避免将复杂的逻辑放在 属性 中。相反,您可以在页面代码后面调用一个方法,然后调用您的 class 的方法:
<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.";
}
不是最优雅的解决方案,但如果没有其他选择,可以使用。