2013-04-23 4 views
0

У меня есть форма с несколькими входами, каждая из которых должна быть 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. Однако из-за того, как он реализован, этого не происходит. Мех.

Я согласен с тем, что добавление .Trim() для каждого геттера и сеттера было бы трудоемким. Особенно, когда вам нужно иметь дело со всей нулевой проверкой, чтобы избежать 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' для каждого публичного объекта? –

+0

Тогда я бы пошел со статическим классом. Честно говоря, я бы использовал этот класс, чтобы либо обрезать значения непосредственно перед их отправкой на процессор, либо в качестве первого шага обработки. Я бы не стал обрезать каждый набор/набор. –

+0

Приветствую вас, думаю, что я просто займусь частной недвижимостью и улажу все, когда это произойдет. –

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

+0

Какая линия имеет это исключение? Вам нужно проверить TxtSurname, если оно равно null, законно, что свойство возвращает null. Посмотрите на основную книгу C#. – David

+1

'set {_txtSurname = value.Trim();}' Trim' на null будет бросать. – Romoku

0

Я бы поставщик два свойства для формы ввода.

public class FormInput 
{ 
    public string Surname { get; set; } 
    public string ValidatedSurname 
    { 
     get 
     { 
      return string.IsNullOrWhiteSpace(Surname) 
        ? string.Empty 
        : Surname.Trim(); 
     } 
    } 
} 
0

Почему бы не создать приватную переменную и не заполнить свойства для вашей формы в полном объеме. Затем вы можете предоставить возможность trim() как для get, так и для свойства и использовать свойство для чтения и назначения ваших значений формы вместо прямого использования поля.

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 Model), вы не сможете напрямую присваивать значения поля и не будете иметь никаких необработанных значений. Конечно, если вы это делаете, вам нужен только набор для обрезки.

+0

Этот подход приведет к исключению NullReferenceException. В частности, вызов .Trim() в _txtSurname в getter, когда _txtSurname имеет значение null и вызывает .Trim() для значения в setter, когда значение равно null. –

+0

Исправленное исправленное решение –

1

Если это новый проект, или это разрешено изменять код, который я бы создать новый Control, производный от TextBox, переопределить Text свойства Обрежьте базовое значение, а затем использовать его вместо стандартного

 Смежные вопросы

  • Нет связанных вопросов^_^