2015-09-28 21 views
0

示例屬性:調用方法,而不是與評估和演示

我可以訪問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 
     } 
    } 
} 

回答

2

沒有,沒有。的ASP.NET Databinder.Eval方法僅支持屬性表達式,如在MSDN(重點煤礦)表示:

從容器對象到公共屬性

有導航路徑沒有替代除了你已經發現的屬性之外的方法調用。

1

你會使用你現有的日期時間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構造,我已經將它初始化爲在例如當前日期。

+1

是的,但GetToday() - 方法只是一個例子。我需要使用約10行代碼在這種方法中進行其他有用的思考。 – Xeddon

+0

@Xeddon我已經更新了答案,以舉例說明如何使用屬性在返回之前操作日期。 – philreed

0

你可以調用一個方法,你只需要得到語法正確:

<%= GetToday() %> 
+0

據我所知,這不會做晚期綁定。 –

+0

@PatrickHofman我還沒有經歷過這類代碼,但是他可以爲該方法添加一個假參數,然後用一些值調用GetToday來進行遲到綁定?類似於'<%= GetToday(Eval(「Something」))%>'和公共字符串GetToday(object utterlyUselessParam){...}後面的代碼' –

0

你是對的,你可以創建一個屬性得到訪問,如果它是非常簡單的方法你例。

由於philreed指出,如果你只是格式化的日期時間,那麼你可以在現有的屬性格式使用評估和演示

<%# 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."; 
} 

不是最完美的解決方案,但如果可以使用沒有其他的選擇。