5

我正在使用带有 ObjectDataSource 的 FormView 并使用 <%# Bind("WhateverProp") %> 进行绑定 - 我的所有可为空的列都返回了其中类型的默认值。

看起来 FormView 对象没有像其他绑定容器那样的 ConvertEmtpyStringToNull 属性。我发现文章表明这​​是 VS 2005 / .Net 2.0 中的一个错误 - 但没有看到任何说明解决方案是什么。

有没有人对我如何解决这个问题有任何建议,而无需重新捕获 ODS_Inserting 事件中的所有字段?我宁愿不必编写代码来重新绑定表单上的所有绑定字段,只是为了测试空值。

4

4 回答 4

6

也为此苦苦挣扎。对于下拉列表,我这样做:

AppendDataBoundItems="true"


<asp:ListItem Text="" Value=""></asp:ListItem>

对于我的 ObjectDataSource,即使我的 UpdateMethod 采用单个参数实体,我也为实体的每个 Nullable 字段添加更新参数并转换为 NULL

<UpdateParameters>
    <asp:Parameter Name="No_Empl_Ferme" Type="Int32" ConvertEmptyStringToNull="true" />
</UpdateParameters>

我对插入做同样的事情。

工作正常。

于 2009-09-25T19:42:04.910 回答
2

我最终这样做了——一种霰弹枪的方法,但在这种情况下,我所有的空字符串值都应该是空值。我还考虑在代码中使用字符串数组来指定哪些值应该为空 - 然后可以循环遍历字符串数组而不是遍历所有值。

protected void RequestItemFormView_ItemInserting(object sender, FormViewInsertEventArgs e)
{
    for (int i = 0; i < e.Values.Count - 1; i++)
    {
        if (e.Values[i].ToString() == string.Empty)
        {
            e.Values[i] = null;
        }
    }
}
于 2009-04-16T13:37:49.813 回答
1

在您的对象数据源中,您需要使用属性 ConvertEmtpyStringToNull="True" 为每个可为空的类型添加 InsertParameters :

<InsertParameters>
   <asp:Parameter Name="NullableFieldName" Type="Int32" ConvertEmptyStringToNull="true"  />            
</InsertParameters>
于 2009-04-24T15:34:09.567 回答
1

Quote: Tonio - 我没有使用单独的参数,而是使用 DataObjectTypeName。我的 insert 方法采用单个参数,这就是我想要保存回数据库的业务对象。——斯科特·艾维 5 月 1 日 12:57

我已经这样修复它:

 protected void FormViewSettings_ItemUpdating(object sender, FormViewUpdateEventArgs e)
  {
     OrderedDictionary values = e.NewValues as OrderedDictionary;

     var personID = values["PersonID"];

     if (string.IsNullOrEmpty(personID.ToString()))
     {
        values.Remove("PersonID");
        values.Add("PersonID", null);
     }
  }

这是一个小技巧,但它工作正常。这样,您可以将对象属性设置为 null 而不是 string.empty,而无需使用 ConvertEmptyStringToNull 设置。

于 2010-02-02T12:29:32.533 回答