【问题标题】:Preventing empty strings becoming NULL in asp.net dynamic-data防止空字符串在 asp.net 动态数据中变为 NULL
【发布时间】:2012-02-15 11:17:56
【问题描述】:

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

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

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

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

在不必更改所有数百个字段的属性的情况下,如何防止空字符串变为 NULL?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 动态站点使用自己生成的 SQL,所以我对此没有任何控制权,不是吗?
    • 啊抱歉 - LINQ2SQL - 我无能为力!我应该更仔细地阅读这个问题:(
    【解决方案2】:

    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。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-21
        • 1970-01-01
        • 1970-01-01
        • 2011-11-04
        • 1970-01-01
        • 2014-02-28
        • 2020-01-14
        • 1970-01-01
        相关资源
        最近更新 更多