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



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

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

在动态数据站点上编辑这些字段时,内部逻辑会将该字段视为NOT NULL,介于TextBox1.Text(一个空字符串)和调用UPDATE sql之间,并将值设置为NULL,然后更新失败。

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

在不必更改所有数百个字段的属性的情况下,我可以做些什么来防止空字符串变为NULL?

是否有一个调用数据库的过程
如果是这样,您可以在这里检查字段值,或者只在每个值后面附加一个空白字符串。

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。

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

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

最新更新