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

    Tengo una propiedad int? MyProperty como miembro en mi fuente de datos (ObjectDataSource). ¿Puedo obligar a un cuadro de texto, comoEnlazando un int nullable a un asp: TextBox

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

    Básicamente quiero obtener un valor null muestra vacía "" en el cuadro de texto, y un número como un número. Si TextBox está en blanco, MyProperty se establecerá en null. Si el TextBox tiene un número, MyProperty debe establecerse en este número.

    Si lo intento, recibo una excepción: "El espacio en blanco no es un Int32 válido".

    Pero, ¿cómo puedo hacer eso? ¿Cómo trabajar con propiedades anulables y Bind?

    ¡Gracias de antemano!

    Respuesta

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

    Puede usar HasValue para determinar si el tipo que admite nulos es nulo, y luego establecer la propiedad Text.

    +2

    Gracias por responder, enduro. Pero esto no funciona en absoluto e incluso no compila. Funcionaría con Eval (al menos después de lanzar el retorno de Eval a int?) Pero Bind es una historia completamente diferente. – Slauma

    2

    Estoy empezando a creer que no es posible enlazar una propiedad de valor que se puede anular. Hasta ahora sólo puedo ver la solución para agregar una propiedad ayudante adicional para enlazar un tipo anulable:

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

    y luego enlazar la propiedad ayudante para el cuadro de texto en lugar del original:

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

    I' Estaré feliz de ver otra solución.

    +0

    Esto no funciona dentro de un 'FormView' donde el origen de datos es un' EntityDataSource' - Acabo de obtener 'DataBinding: 'System.Web.UI.WebControls.EntityDataSourceWrapper' no contiene una propiedad con el nombre 'MyBindableProperty'. ' – Rich

    4

    Bueno, he encontrado una solución, que incluye un FormView sin embargo y no especifica si eso se ajusta a su situación.

    De todos modos, en mi caso, la entidad DataBound-ed es un dto propio (no es que importe) y el truco es que cuando actualizas la vista de formulario tienes que adjuntar esencialmente el evento pre-databound y re -Escribir la cadena vacía como un valor nulo de manera que el marco puede propiedad inyectar el valor al objeto construido:

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

    y de manera similar en el inserto

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

    lo que hace este realmente divertido es la hecho de que th El mensaje de error e (no es un Int32 válido) es en realidad incorrecto y debería escribirse (no es un Nullable válido) pero los elementos obligatorios habrían sido ciudadanos de primera clase, ¿no es así?

    Cuestiones relacionadas