asp.net
  • data-binding
  • nullable
  • 2010-03-25 4286 views 5 likes 
    5

    Tôi có một tài sản int? MyProperty là một thành viên trong nguồn dữ liệu của tôi (ObjectDataSource). Tôi có thể ràng buộc này cho một TextBox, nhưRàng buộc một int vô giá vào một asp: TextBox

    <asp:TextBox ID="MyTextBox" runat="server" Text='<%# Bind("MyProperty") %>' /> 
    

    Về cơ bản tôi muốn có được một giá trị null hiển thị như trống "" trong TextBox, và một số như một số. Nếu TextBox trống MyProperty phải được đặt thành null. Nếu TextBox có một số trong đó, MyProperty sẽ được đặt thành số này.

    Nếu tôi thử, tôi nhận được ngoại lệ: "Blank không phải là Int32 hợp lệ".

    Nhưng làm cách nào tôi có thể làm điều đó? Làm thế nào để làm việc với các thuộc tính nullable và Bind?

    Cảm ơn trước!

    Trả lời

    1
    <asp:TextBox ID="MyTextBox" runat="server" 
    
    Text='<%# Bind("MyProperty").HasValue ? Bind("MyProperty") : "" %>' /> 
    

    Bạn có thể sử dụng HasValue để xác định xem loại null có rỗng hay không và sau đó đặt thuộc tính Văn bản.

    +2

    Cảm ơn bạn đã trả lời, enduro. Nhưng điều này không làm việc ở tất cả và thậm chí không biên dịch. Nó sẽ làm việc với Eval (ít nhất là sau khi đúc sự trở lại của Eval thành int?) Nhưng Bind là một câu chuyện hoàn toàn khác. – Slauma

    2

    Tôi bắt đầu tin rằng không thể ràng buộc thuộc tính giá trị có thể vô hiệu. Cho đến bây giờ tôi chỉ có thể xem cách giải quyết để thêm một tài sản helper thêm để ràng buộc một loại nullable:

    public int? MyProperty { get; set; } 
    
    public string MyBindableProperty 
    { 
        get 
        { 
         if (MyProperty.HasValue) 
          return string.Format("{0}", MyProperty); 
         else 
          return string.Empty; 
        } 
    
        set 
        { 
         if (string.IsNullOrEmpty(value)) 
          MyProperty = null; 
         else 
          MyProperty = int.Parse(value); 
          // value should be validated before to be an int 
        } 
    } 
    

    và sau đó ràng buộc tài sản helper cho TextBox thay vì bản gốc:

    <asp:TextBox ID="MyTextBox" runat="server" 
        Text='<%# Bind("MyBindableProperty") %>' /> 
    

    tôi d vui khi thấy một giải pháp khác.

    +0

    Điều này không hoạt động bên trong một 'FormView' nơi nguồn dữ liệu là một' EntityDataSource' - Tôi chỉ nhận được 'DataBinding: 'System.Web.UI.WebControls.EntityDataSourceWrapper' không chứa một thuộc tính có tên 'MyBindableProperty'. ' – Rich

    4

    Tôi cũng đã tìm thấy một giải pháp, bao gồm FormView tuy nhiên bạn không chỉ định xem liệu nó có phù hợp với kịch bản của bạn hay không. Dù sao, trong trường hợp của tôi, thực thể DataBound-ed là một dto của riêng tôi (không phải là nó quan trọng) và lừa là khi bạn cập nhật formview bạn phải về cơ bản gắn vào sự kiện pre-databound và tái -Viết các chuỗi rỗng như một giá trị null để khuôn khổ tài sản có thể tiêm các giá trị cho các đối tượng xây dựng:

    protected void myFormView_Updating(object sender, FormViewUpdateEventArgs e) 
    { 
        if (string.Empty.Equals(e.NewValues["MyProperty"])) 
         e.NewValues["MyProperty"] = null; 
    } 
    

    và tương tự trên chèn

    protected void myFormView_Inserting(object sender, FormViewInsertEventArgs e) 
    { 
        if (string.Empty.Equals(e.Values["MyProperty"])) 
         e.Values["MyProperty"] = null; 
    } 
    

    những gì làm cho thực sự vui nhộn này là thực tế là lần thứ e thông báo lỗi (không phải là một Int32 hợp lệ) là thực sự sai và nó nên viết (không phải là một Nullable hợp lệ) nhưng sau đó nullables sẽ có được công dân hạng nhất sẽ không họ?

    Các vấn đề liên quan