0

我有一个包含许多输入的表格,每个输入都需要Trim在处理之前进行处理。在每次使用值时修剪这些值会很费力 - 而且不是很健壮,因为每个值都在表单代码隐藏中的许多地方使用。

我正在考虑为我的每个属性做这样的事情:

private string _surname
public string Surname
{
    get
    {
        return _surname.Trim();
    }
    set
    {
        _surname = value;
    }
}

protected void Page_Load(object sender, EventArgs e)
{
    Surname = txtSurname.Text;
}

不过,即使这看起来也很冗长。特别是对于具有大量输入的表单。也许很简单:

private string _txtSurname;

protected void Page_Load(object sender, EventArgs e)
{
    _txtSurname = txtSurname.Text.Trim();
}

但这与第一个示例没有相同的鲁棒性,如果我在其他地方分配相同的属性,我可能会忘记我需要先修剪。我觉得应该有一种更简洁的方式来处理这个问题。在那儿?

4

5 回答 5

6

更新:扩展方法方法,虽然从可读性的角度来看功能不是很好。直观地说,调用foo.NullSafeTrim();wherefoo = null会抛出一个NullReferenceException. 但是,由于它的实现方式,它没有。嗯。

我同意添加.Trim()到每个 getter 和 setter 会很费力。尤其是当您必须处理所有 null 检查以避免NullReferenceExceptions. 另一种使代码更紧凑的选择是使用扩展方法。例如:

public static class MyExtensions
{
     public static string NullSafeTrim(this string value)
     {
         if (value != null)
         {
             value = value.Trim();
         }

         return value;
     }
}

然后你可以使用以下模式:

private string _surname;
public string Surname
{
    get { return _surname.NullSafeTrim(); }
    set { _surname = value.NullSafeTrim(); }
}

使用扩展方法有一些注意事项,您应该能够通过搜索 SO 找到这些方法。

或者,您可以在处理值的任何类中执行所有修剪和空值检查。

于 2013-04-23T12:58:55.097 回答
1

如果它是一个新项目或者允许修改代码,我将创建一个Control派生自的新项目TextBox,覆盖该Text属性以修剪基值,然后使用它而不是标准的

于 2013-04-23T13:12:48.493 回答
1

空的 get 不起作用,您的设置实际上没有设置到支持字段!

private string _txtSurname
{
   get;  // problematic!
   set { return value.Trim();}
}

试试下面:

public string TxtSurname
{
   get { return _txtSurname;}
   set { _txtSurname=value.Trim();}
}

在页面加载中,不要在私有成员中工作,而是使用属性

protected void Page_Load(object sender, EventArgs e)
{
    TxtSurname = SomeText.Trim();
}
于 2013-04-23T11:31:32.493 回答
0

为什么不创建私有变量并完整填写表单的属性。然后,您可以在属性的 get 和 set 上提供 trim() 功能,并使用该属性来读取和分配您的表单值,而不是直接使用该字段。

private string _txtSurname;

public string TxtSurname
{
    get
    {
        return string.IsNullOrWhiteSpace(_txtSurname) ? string.Empty : _txtSurname.Trim();
    }
    set
    {
        _txtSurname = value.Trim();
    }
}

这样,如果您设置或获取该值而无需担心它会在其他任何地方被修剪

protected void Page_Load(object sender, EventArgs e)
{
    this.TxtSurname = txtSurname.Text();
}

如果您将表单属性移动到它们自己的类中并将字段值设为私有并且将属性设为公开(例如当您开发使用视图模型的位置时),那么您将无法直接分配给字段值并且不会冒险任何未修剪的值。当然,如果你这样做,那么你只需要设置来进行修剪。

于 2013-04-23T11:48:09.373 回答
0

我将为表单输入提供两个属性。

public class FormInput
{
    public string Surname { get; set; }
    public string ValidatedSurname
    {
        get
        {
            return string.IsNullOrWhiteSpace(Surname)
                   ? string.Empty
                   : Surname.Trim();
        }
    }
}
于 2013-04-23T11:43:45.140 回答