使用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
       }
   }
}

使用Eval调用方法而不是属性

不,没有。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.";
}

不是最优雅的解决方案,但如果没有其他选择,也可以使用。