Чак Норрис
- Вопросы
- Ответы
Имя | Неизвестно |
Возраст | Неизвестно |
Сайт | Неизвестно |
Неизвестно | |
Участвует в проекте | 1103 дн., 22 час., 56 мин. |
Последняя активность | 535 дн., 7 час., 46 мин. назад |
Ответы
Перейти к вопросу →
Техника приведенная в комментариях к вопросу тоже имеет право на существование.
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"