我有一个包含多个输入的表单,每个表单在处理之前都需要Trim
med。在价值的每次使用中修剪它们都是费力的 - 而且不是很强大 - 因为每种情况都在表格背后的许多地方使用。
我想为我的每个属性做这样的事情:
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 :(得分:6)
更新:扩展方法方法,虽然从可读性的角度来看功能不是很好。直观地,调用foo.NullSafeTrim();
,其中foo = null
会抛出NullReferenceException
。但是,由于它的实现方式,它没有。 MEH。
我同意将.Trim()
添加到每个getter和setter都很费力。特别是当您必须处理所有空值检查以避免NullReferenceException
时。另一个使代码更紧凑的选项是使用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来解决这些问题。
或者,您可以在处理值的任何类中执行所有修剪和空检查。
答案 1 :(得分:1)
空的get不起作用,你的设置实际上没有SET到支持字段!
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();
}
答案 2 :(得分:1)
如果是新项目或者允许修改代码,我会创建一个派生自Control
的新TextBox
,覆盖Text
属性以修剪基值,然后使用它而不是标准的
答案 3 :(得分:0)
我会为表单输入提供两个属性。
public class FormInput
{
public string Surname { get; set; }
public string ValidatedSurname
{
get
{
return string.IsNullOrWhiteSpace(Surname)
? string.Empty
: Surname.Trim();
}
}
}
答案 4 :(得分: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();
}
如果您将表单属性移动到他们自己的类中并使字段值为私有且属性为public(就像您在使用View模型的地方开发那样)那么您将无法直接分配字段值并且没有任何未经修改的价值的风险。当然,如果您正在执行此操作,那么您只需要该设置即可进行修剪。