使用 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.";
}

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