Ответы пользователя Чак Норрис - CodeHelper

Чак Норрис

Чак Норрис
Карма 3384
Имя Неизвестно
Возраст Неизвестно
Сайт Неизвестно
Twitter Неизвестно
Участвует в проекте 1103 дн., 22 час., 56 мин.
Последняя активность 535 дн., 7 час., 46 мин. назад
О себе ничего не указано

Ответы

Новые Лучшие
1
...
4
5
6
7
8
...
12
Перейти к вопросу →

Техника приведенная в комментариях к вопросу тоже имеет право на существование.

private IChildPresenter childPresenter;

public IChildPresenter ChildPresenter
{
    get
    {
        if (childPresenter == null)
            childPresenter = ApplicationContext.GetInstance<IChildPresenter>();
        return childPresenter;
    }
    set { childPresenter = value; }
}

То есть если зависимость определена — возвращаем её, в противном случае — достаем зависимость из ioc-контейнера (который в этом случае работает как сервис-локатор). Особенно часто такая техника применяется для объектов, которым нельзя подсунуть зависимости во время выполнения программы, но можно во время тестирования. Классический пример — инъекция зависимостей в атрибуты. В runtime атрибуты создаются автоматически и нет возможности инъекции собственных зависимостей, а в классе теста можно легко самому инстанцировать объект атрибута и передать ему все, что нужно. Поэтому атрибуту делают 2 конструктора — один без параметров, а другой со всеми нужными зависимостями. Причем во время выполнения, если атрибуту не задана какая-то зависимость, то он сам «лезет» за ней в ioc-контейнер.

Вот пример:

public class MyAttribute : Attribute
{
    private Dependency _dependency;

    // Этот конструктор используется в runtime
    public MyAttribute(){} 

    // Этот конструктор используем мы сами во время тестирования
    public MyAttribute(Dependency dependency)
    {
        _dependency = dependency;
    }

    protected Dependency
    {
        get
        {
            // Если зависимость не задана, то дастаем ее из контейнера
            if (_dependency == null)
                return ServiceLocator.Get<Dependency>()
            return _dependency;
        }
    }
}
Перейти к вопросу →

Если посмотреть реализацию метода TextAreaExtensions.TextArea(), то видно, что в нем значения атрибутов установки размерности перекрываются значениями по умолчанию:

private const int TextAreaRows = 2;
private const int TextAreaColumns = 20;

// ...

public static string TextArea(
        this HtmlHelper htmlHelper, string name, 
        IDictionary<string, object> htmlAttributes) {
    Dictionary<string, object> implicitAttributes = new Dictionary<string, object>();
    implicitAttributes.Add("rows", TextAreaRows.ToString(CultureInfo.InvariantCulture));
    implicitAttributes.Add("cols", TextAreaColumns.ToString(CultureInfo.InvariantCulture));
    return TextAreaHelper(htmlHelper, name, true /* useViewData */, null /* value */, implicitAttributes, null /* explicitParameters */, htmlAttributes);
}

Поэтому указывать rows и cols в атрибутах бесполезно. Нужно использовать один из методов:

public static string TextArea(
    this HtmlHelper htmlHelper, string name, string value, 
    int rows, int columns, 
    IDictionary<string, object> htmlAttributes);

или

public static string TextAreaFor<TModel, TProperty>(
    this HtmlHelper<TModel> htmlHelper, 
    Expression<Func<TModel, TProperty>> expression, 
    int rows, int columns, 
    IDictionary<string, object> htmlAttributes)

Оба метода для определения дополнительных атрибутов принимают словарь, а не анонимный объект, поэтому придется писать что-то типа этого:

<%=Html.TextAreaFor(
    m => m.Description, 15, 20, 
    new RouteValueDictionary(new { @class = "someClass"}))%>
Перейти к вопросу →

Известно, что не все браузеры скрывают полный путь к файлу. IE7, например, этот путь показывает. В Firefox когда-то тоже можно было получить полный путь, вот соответствующий баг, который сейчас исправлен. На форуме Firefox есть тема Firefox 3 don't copy complete path file, в которой обсуждается этот вопрос. Из предложенных решений можно отметить:

1) Трюк с OnBlur — Создается дополнительное скрытое поле, которое будет хранить полный путь к файлу. Элементу input с type=file на событие OnBlur устанавливается код, который копирует текст (который и является путем к файлу) и помещает этот текст в скрытое поле. Затем значение текстового поля можно использовать как на клиенте так и на сервере. Не известно, работает ли этот трюк во всех версиях Firefox

2) Использование компонента nsIDOMFile. Firefox не дает узнать путь к файлу, но позволяет получить сами данные из этого файла в виде DataUri. Например, такой код позволяет извлечь из input[type=file] картинку и назначить ее элементу img для предпросмотра.

var oImg = document.getElementById('oBannerPreviewImg');
oImg.src = document
    .getElementById('oUploadPicture')
    .files[0]
    .getAsDataURL();

Оба названных трюка могут работать в Firefox, но в остальных браузерах нужно искать другие решения.

Перейти к вопросу →

Нужно использовать специальное свойство class, которое хранит тип загружаемой сущности. Это свойство можно использовать в HQL или Criteria API:

var list = session
    .CreateCriteria(typeof(BaseClass))
    .Add(Restrictions.Disjunction()
        .Add(Restrictions.Eq("class", typeof(ClassB)))
        .Add(Restrictions.Eq("class", typeof(ClassC))))
    .List<BaseClass>();
Перейти к вопросу →

Нужно использовать свойство size (в HQL). Есть два варианта его использования. Так:

from Person p order by size(p.Pets)

Или так:

from Person p order by p.Pets.size
Перейти к вопросу →

Есть решение, но выглядит не очень красиво (источник приводить не буду, потому что это гнусный проприетарный сайт). Для примера рассмотрим список из двух колонок, в первой — номер строки, во второй — текст:

<ListBox ItemsSource="{Binding ItemsSourceField}" >
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="30" />
                    <ColumnDefinition />
                </Grid.ColumnDefinitions>
                <TextBlock 
                    Grid.Row="0" 
                    Grid.Column="0" 
                    Text= "{Binding 
RelativeSource={RelativeSource FindAncestor, AncestorType=ListBoxItem}, 
Converter={StaticResource rowIndexConverter}}"/>
                <TextBlock 
                    Grid.Row="0" 
                    Grid.Column="1" 
                    Text="{Binding Text}" />
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Код конвертера:

public class RowIndexConverter: IValueConverter
{
    public object Convert(
        object value, Type targetType, 
        object parameter, CultureInfo culture)
    {
        ListBoxItem item = value as ListBoxItem;
        ListBox view = ItemsControl.ItemsControlFromItemContainer(item) as ListBox;
        int index = view.ItemContainerGenerator.IndexFromContainer(item);
        return index.ToString();
    }

    public object ConvertBack(
        object value, Type targetType, 
        object parameter, CultureInfo culture)
    {
        throw new Exception(...);
    }
}

Если коллекция-источник для списка может изменяться, то после изменения нужно выполнить код для синхронизации:

ICollectionView view = 
    CollectionViewSource.GetDefaultView(ItemsSourceField)
    as ListCollectionView;
view.Refresh();

Есть еще один вариант — в статье Rownumber in Silverlight Datagrid or Listbox

Перейти к вопросу →

Нужно использовать ограничение LIKE в связке с ограниченияма OR. Например, с помощью критериев:

var criteria = session
    .CreateCriteria(typeof(Product))
    .Add(Restrictions.Or(
        Restrictions.Like("Name", searchQuery, MatchMode.Anywhere),
        Restrictions.Like("Description", searchQuery, MatchMode.Anywhere)));
Перейти к вопросу →

NHibernate загружает весь граф, который получается в результате выполнения запроса. Поэтому, чтобы обойти lazy нужно вручную написать запрос и сделать join/fetch на соответствующее поле-коллекцию. Что-то типа этого (HQL):

from A a
    join a.ListOfB
Перейти к вопросу →

Классический вариант решения — это конечно тег meta. Но есть еще один экзотический способ. Файл robots.txt принято считать статическим и не гибким ресурсом. В то же время никто не запрещает генерировать его динамически. В ASP.NET, например, можно использовать обобщенный обработчик, на который будет перенаправляться запрос к robots.txt. Внутри обработчика легко реализовать соответствующую логику, при необходимости обращаясь к слою доступа к данным. В некоторых источниках упоминается техника комбинирования — часть содержания robots.txt генерируется, а другая часть импортируется из статичного файла.

В большинстве случаев в контексте определенного запроса легче определить нуждается ли страница в индексировании. Поэтому применение тегов meta robots более оправдано. Но, если есть возможность перечислить запрещенные ресурсы имея только доступ к базе и сервисам приложения, то лучше воспользоваться именно методом генерации robots.txt, потому что он позволяет поисковикам без загрузки контента определить, что страница исключена.

Перейти к вопросу →

Элементы <set>, <list>, <map>, <bag>, <array> и <primitive-array> поддерживают следующие атрибуты для управления сортировкой:

  • sort — задает настройки сортировки на уровне коллекции. Возможные значения - unsorted, natural или конкретный класс comparator. Позволяет использовать натуральную сортировку или указать класс компаратора.
  • order-by — позволяет задать колонку и направление сортировки на уровне SQL запроса. Формат "КолонкаДляСортировки asc|desc"

1
...
4
5
6
7
8
...
12
v1.7.123.556
© 2009—2010 CodeHelper FAQ | О сайте | Обратная связь | История изменений | Статьи
Creative Commons LicenseМатериалы сайта распространяются под лицензией Creative Commons Attribution-Share Alike 3.0 Unported.