Что ж, мне удалось кое-что придумать, но мне очень хотелось бы услышать мнение сообщества (и, возможно, @Chuck Norris, написавшего ValueInjecter)...
Итак, чтобы переформулировать проблему....
- У вас есть плоская модель представления, которая используется в вашем представлении.
- Представление имеет сетку, столбцы которой являются свойствами указанной модели представления.
- Когда пользователь нажимает на столбец, sort=columnName передается контроллеру.
- Итак, теперь вам нужно декодировать сплющенное имя свойства в исходный граф объектов, чтобы передать его в ваш репозиторий для сортировки на стороне сервера (например, с использованием Dynamic Expression APi, Dynamic LINQ или подобных)...
Итак, если Company
имеет свойство с именем President
типа Employee
, а Employee
имеет свойство с именем HomeAddress
типа Address
, а Address
имеет строковое свойство с именем Line1
, тогда:
"President.HomeAddress.Line1
" будет сведено к свойству "PresidentHomeAddressLine1
" в вашей модели представления.
Для пользовательской сортировки на стороне сервера Dynamic Linq требуется точечный путь к свойству, а не плоский. Мне нужно, чтобы ValueInjecter распаковывал только плоское свойство! а не весь класс.
Вот что я придумал (соответствующая логика, извлеченная из метода, который делает другие вещи:
// type is type of your unflattened domain model.
// flatProperty is property name in your flattened view model
public string GetSortExpressionFor(Type type, string flatPropertyPath)
{
if (type == null || String.IsNullOrWhiteSpace(flatPropertyPath))
{
return String.Empty;
}
// use ValueInjecter to find unflattened property
var trails = TrailFinder.GetTrails(flatPropertyPath, type.GetInfos(), typesMatch => true).FirstOrDefault();
var unflatPropertyPath = (trails != null && trails.Any()) ? String.Join(".", trails) : String.Empty;
return unflatPropertyPath;
}
// sample usage
var unflatPropertyPath = GetSortExpressionFor(typeof(Company), "PresidentHomeAddressLine1");
// unflatPropertyPath == "President.HomeAddress.Line1"
person
zam6ak
schedule
08.06.2012