我正在使用带有ObjectDataSource的FormView并使用<%#Bind(“WhateverProp”)%>进行绑定 - 并且我的所有可空列都返回其中包含类型的默认值。
看起来FormView对象没有像其他绑定容器那样的ConvertEmtpyStringToNull属性。我发现文章暗示这是VS 2005 / .Net 2.0中的一个错误 - 但是没有看到任何说法是什么决议。
有没有人有任何关于如何解决这个问题的建议,而不仅仅是重新捕获ODS_Inserting事件中的所有字段?我宁愿不必编写代码来重新绑定表单上的所有绑定字段,只是为了测试空值。
答案 0 :(得分:6)
也挣扎着。 对于下拉列表,我这样做:
AppendDataBoundItems="true"
<asp:ListItem Text="" Value=""></asp:ListItem>
对于我的ObjectDataSource,即使我的UpdateMethod接受一个参数,实体,我为实体的每个Nullable Field添加Update params并转换为NULL
<UpdateParameters>
<asp:Parameter Name="No_Empl_Ferme" Type="Int32" ConvertEmptyStringToNull="true" />
</UpdateParameters>
我对插入也这样做。
工作正常。
答案 1 :(得分: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;
}
}
}
答案 2 :(得分:1)
在Object DataSource中,您需要为每个可空类型添加InsertParameters,并使用Attribute ConvertEmtpyStringToNull =“True”:
<InsertParameters>
<asp:Parameter Name="NullableFieldName" Type="Int32" ConvertEmptyStringToNull="true" />
</InsertParameters>
答案 3 :(得分:1)
引用: Tonio - 我没有使用单独的参数,而是使用DataObjectTypeName。我的insert方法只需要一个参数,这就是我想要保存回数据库的业务对象。 - Scott Ivey 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);
}
}
这是一个小小的黑客,但它工作正常。 这样,您可以在不使用ConvertEmptyStringToNull设置的情况下将object属性设置为null而不是string.empty。