2013-04-23 51 views
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(); 
} 

但是,这并不具有相同的鲁棒性在第一个例子,如果我分配到同一属性的其他地方,我会忘记,我首先需要修剪。我觉得应该有一个更简洁的方式来处理这个问题。在那儿?

+0

修改了我巨大的错误代码。 – 2013-04-23 12:36:43

回答

6

UPDATE:该扩展方法的办法,而职能是不是从可读性的角度很大。直观地看,调用foo.NullSafeTrim();其中foo = null将抛出一个NullReferenceException。但是,由于它实施的方式,它没有。咩。

我同意加入.Trim()每一个getter和setter是很费力的。特别是当你必须处理所有的空检查以避免NullReferenceException s。另一个可以使代码更紧凑的选项是使用Extension Methods。例如:

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与搜索调高一些注意事项。

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

+0

我应该提到我在这个项目中被困在.NET v2.0上 - 但是,我喜欢这个想法,所以我会用静态工具类来做类似的事情。 你知道有什么方法将访问者逻辑封装在一个地方,所以我不必为每个公共属性都重复'NullSafeTrim'调用吗? – 2013-04-23 13:03:10

+0

然后我会去静态工具类。坦率地说,我会使用这个类来修改它们发送到处理器之前的值,或者作为处理的第一步。我不会费心修整每一个get/set。 – 2013-04-23 13:16:12

+0

干杯,我认为我只是要处理私人财产,并修改所有内容。 – 2013-04-23 13:19:37

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(); 
} 
+1

'NullReferenceException'等待发生。 – Romoku 2013-04-23 11:35:46

+0

哪条线发生这种异常?如果它是空的,你需要检查TxtSurname,这个属性返回null是合法的。看看基本的C#书。 – David 2013-04-23 11:36:37

+1

'set {_txtSurname = value.Trim();}''Trim' on null会抛出。 – Romoku 2013-04-23 11:37:35

0

我会提供两个属性的表单输入。

public class FormInput 
{ 
    public string Surname { get; set; } 
    public string ValidatedSurname 
    { 
     get 
     { 
      return string.IsNullOrWhiteSpace(Surname) 
        ? string.Empty 
        : Surname.Trim(); 
     } 
    } 
} 
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(); 
} 

任何地方,如果你移动窗体属性为自己的阶级和取得的字段值私人方式和公共属性,那么你将无法直接分配给字段值,也不会冒险让任何修剪值(当你开发,你用视图模型等)。当然,如果你这样做,那么你只需要设置进行修整。

+0

这种方法将导致NullReferenceException。具体而言,当_txtSurname为null时,在getter的_txtSurname上调用.Trim(),并且当value为null时,在setter中调用.Trim()。 – 2013-04-23 12:39:47

+0

真正的修正解决方案 – 2013-04-24 14:01:10

1

如果它是一个新的项目,或者它可以修改我将创建一个新ControlTextBox导出代码,重写Text属性来修剪基值,然后用它来代替标准的一个