在asp.net动态数据中防止空字符串变为NULL

时间:2012-02-15 11:17:57

标签: asp.net asp.net-dynamic-data dynamic-data-site

我有一个标准的ASP.NET 4动态数据站点(使用Linq to SQL)。

在我的SQL-Server数据库中,我有数百个varchar字段设置为NOT NULL,但默认值为空字符串。它们永远不应该是NULL,但它们可能有一个空字符串作为内容。

在动态数据站点上编辑这些字段时,内部逻辑将字段视为NOT NULL,并且在TextBox1.Text(这是一个空字符串)之间的某处,并调用UPDATE sql,它将值设置为NULL并且它们更新失败

我可以看到System.Web.DynamicData.MetaColumn有一个属性'ConvertEmptyStringToNull',但它是只读的。

如何防止空字符串变为NULL而不必更改所有数百个字段的属性,我该怎么办?

3 个答案:

答案 0 :(得分:0)

您是否只有一个程序来调用您的数据库? 如果是这样,您可以在此处检查字段值,或者只是为每个值附加一个空字符串。

答案 1 :(得分:0)

FieldTemplates / Text_Edit.ascx.cs 中更改字符串的行为,首先删除 验证器,因为它们阻止提交表单:

protected void Page_Load(object sender, EventArgs e) {
    TextBox1.MaxLength = Column.MaxLength;
    if (Column.MaxLength < 20)
        TextBox1.Columns = Column.MaxLength;
    TextBox1.ToolTip = Column.Description;

    if (Column.IsString)
    {
        this.Controls.Remove(RequiredFieldValidator1);
        this.Controls.Remove(RegularExpressionValidator1);
        this.Controls.Remove(DynamicValidator1);
    }
    else
    {
        SetUpValidator(RequiredFieldValidator1);
        SetUpValidator(RegularExpressionValidator1);
        SetUpValidator(DynamicValidator1);
    }
}

将空字符串转换为NULL的代码片段在ConvertEditedValue方法中的某处,因此跳过字符串:

protected override void ExtractValues(IOrderedDictionary dictionary) 
{
    if (Column.IsString)
    {
        dictionary[Column.Name] = TextBox1.Text;
    }
    else
    {
        dictionary[Column.Name] = ConvertEditedValue(TextBox1.Text);
    }
}

现在您可以使用空字符串更新表,当然问题是您现在可以为所有varchar字段设置空字符串,而不仅仅是具有默认值的字符串。

我没有在Linq to SQL或EF数据模型中看到任何地方,我可以找到我的SQL-Server默认值。有一个属性DefaultValue但它总是NULL。

答案 2 :(得分:0)

由于您希望在数据库中设置默认值(空字符串)而不在应用程序中,因此请考虑使用相关列上的元数据来默认为数据库的初始化:

[Column(IsDbGenerated = true, UpdateCheck = UpdateCheck.Never, AutoSync=AutoSync.Never)]
public object MyColumn { get; set; }