C#: Проверить на null в монаде

public static TResult With<tinput tresult="">
(this TInput o, Func<tinput tresult=""> evaluator)
where TResult : class
where TInput : class
{
    return (o == null) ? return null : evaluator(o);
}

Использовать так:

string postCode = this.With(x => person)
 .With(x => x.Address)
 .With(x => x.PostCode);

IE теряет фокус на ссылке

В IE обнаружен загадочный баг.

Если ASP.Net страница:

  • делает (например, по нажатию на страницу) redi­rect на другую через anchor (т.е. otherPage.aspx#anchor)
  • в IIS настроен ISAPI_Rewrite (локально повторить не удалось)
  • браузер – IE (повторяется в т.ч. в 9-ом)

То может случиться так, что anchor “отбросится” и страниця загрузится как otherPage.aspx.

Выловить и перенастроить практически невозможно.

Единственный выход – вместо redi­rect вставлять в lit­er­al на странице “<script language=’javascript’>location.href = ‘otherPage.aspx#anchor’;</script>”. Можно дополнительно поставить проверку – делать такой redi­rect только если браузер ie. Название браузера искать в Request.Browser.Type.

О document.ready заботаться не стоит – redi­rect он и есть redi­rect.

Sitecore: Database returns old value

Вы исправили какие-то данные в базе Sitecore, но на странице у вас то же самое? Значит, надо проверить следующие варианты:

  1. Вы исправили в mas­ter, но забыли опубликовать это в web. Перейдите в web и провериться.
  2. Вы изменили не во всех языках. Вернитесь в mas­ter и проверьте, выбрав другой флаг. Этот шаг очень часто забывают.
  3. Вы используете дурацкую систему кэширования и она возвращает вам старые значения.

Чтобы 1 и 2 портили вам как можно меньше крови — везде, где можно, заменяйте текстовые константы на внутренние ссылки sitecore. И тогда даже если элемент куда-нибудь переедет,  ссылка будет в порядке.

C#: Number Range в Combobox

Например, нам нужно положить в telerik-оподобный con­trol список из вот таких элементов:

<telerik:radcomboboxitem runat="server" text="2010" value="10" >

Такие штуки надо генерировать в одну строку:

private const int CC_VALID_YEARS_RANGE = 9;
....................................................................................
ddlYear.DataSource = Enumerable.Range(DateTime.Today.Year, CC_VALID_YEARS_RANGE)
                               .ToDictionary(item => item.ToString(),
                                             item => (item % 1000).ToString());
ddlYear.DataTextField = "Key";
ddlYear.DataValueField = "Value";
ddlYear.DataBind();

А если надо добавить ещё одну строку Year с пустым значением — нужно предварительно сбросить Dic­tio­nary в ToList() (получится List < Key­Val­ue­Pair < string, string > >) и сделать insert в 0-ой индекс. Дело в том, что Dic­tio­nary<> сам по себе не сортируется — соответственно, Insert-а в нём нет и fore­ach перебирает его в том же порядке, в каком элементы добавились.

private const int CC_VALID_YEARS_RANGE = 9;
....................................................................................
List <KeyValuePair<string, string>> yearsList =
              Enumerable.Range(DateTime.Today.Year, CC_VALID_YEARS_RANGE)
                        .ToDictionary(item => item.ToString(),
                                      item => (item % 1000).ToString()).ToList();
yearsList.Insert(0, new KeyValuePair < string,string > ("Year", String.Empty));
ddlYear.DataSource = yearsList;
ddlYear.DataTextField = "Key";
ddlYear.DataValueField = "Value";
ddlYear.DataBind();

C#: List> в DataGrid

Когда-то List<> скидывали в Data­Grid вот так:

dataGridView.DataSource = null;
dataGridView.DataSource = list;

Но увы — если загружать list таким образом, в ViST2008 мы будем получать Index­Out­OfRange­Ex­cep­tion каждый раз, когда попытаемся его выделить. 🙁

Поэтому надо привязывать Bind­ingList, который умеет обновляться автоматически. А обновлять только ширину колонок:

dataGridView.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader);

C#: Enum в ComboBox

Сбросить Enum в Com­bobox можно одной строкой:

comboBox.DataSource = Enum.GetValues(typeof(AnEnumType));
comboBox.SelectedItem = AnEnumType.Value