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

时间:2015-09-28 09:33:58

标签: c# asp.net gridview eval

示例:

我可以访问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
       }
   }
}

4 个答案:

答案 0 :(得分:2)

不,没有。 ASP.NET Databinder.Eval方法仅支持属性表达式,如MSDN中所述(强调我的):

  

从容器对象到公共属性

的导航路径

除了已经发现的属性之外,方法调用没有其他选择。

答案 1 :(得分:1)

您最好使用现有的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的构造函数中,我已将其初始化为示例中的当前日期。

答案 2 :(得分:0)

您可以调用方法,只需要使语法正确:

<%= GetToday() %>

答案 3 :(得分:0)

如果它是一个简单的方法,你可以使用 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.";
}

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