Привязка обнуляемого int к asp: TextBox - PullRequest
5 голосов
/ 26 марта 2010

У меня есть свойство int? MyProperty в качестве члена моего источника данных (ObjectDataSource). Могу ли я связать это с TextBox, как

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

В основном я хочу, чтобы значение null отображалось как пустое "" в TextBox, а число - как число. Если поле TextBox пустое, MyProperty должно быть установлено на null. Если в TextBox есть номер, MyProperty должен быть установлен на этот номер.

Если я попытаюсь это сделать, я получу исключение: «Пробел не является действительным Int32».

Но как я могу это сделать? Как работать со свойствами Nullable и Bind?

Заранее спасибо!

Ответы [ 3 ]

4 голосов
/ 05 июня 2012

Ну, я нашел решение, которое включает в себя FormView, но вы не указываете, соответствует ли это вашему сценарию.

Так или иначе, в моем случае объект DataBound-ed - это мое собственное dto (не то, чтобы это имело значение), и хитрость в том, что когда вы обновляете форму, вы должны по существу присоединиться к событию, связанному с данными, и повторно запишите пустую строку как нулевое значение, чтобы инфраструктура могла встраивать значение в построенный объект:

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

и аналогично на вставке

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

что делает это действительно забавным, так это то, что сообщение об ошибке (не является допустимым Int32) на самом деле неверно, и оно должно писать (не является допустимым Nullable), но тогда nullables были бы первым классом граждане не так ли?

2 голосов
/ 26 марта 2010

Я начинаю верить, что невозможно связать свойство с нулевым значением. До сих пор я вижу только обходной путь для добавления дополнительного вспомогательного свойства для привязки типа 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
    }
}

и затем привязать вспомогательное свойство к TextBox вместо оригинала:

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

Я был бы рад увидеть другое решение.

1 голос
/ 26 марта 2010
<asp:TextBox ID="MyTextBox" runat="server" 

Text='<%# Bind("MyProperty").HasValue ? Bind("MyProperty") : "" %>' />

Вы можете использовать HasValue, чтобы определить, имеет ли тип null-значение null, а затем установить свойство Text.

...