public ScreenDefinition(string relativeRoute, ViewModelCreator <TViewModel> defaultViewModelCreator) { RelativeRoute = relativeRoute.Trim(); IsParameterRoute = RelativeRoute.StartsWith("{") && RelativeRoute.EndsWith("}"); ParameterName = RelativeRoute.Substring(1, RelativeRoute.Length - 2); DefaultViewModelCreator = defaultViewModelCreator ?? throw new ArgumentNullException(nameof(defaultViewModelCreator)); }
public RoutedDataModel GetRouteDataModel(PageUrlData pageUrlData) { if (pageUrlData.PageId != _pageId) { return(null); } string pathInfo = pageUrlData.PathInfo; bool pathIsEmpty = string.IsNullOrEmpty(pathInfo); if (pathIsEmpty && !pageUrlData.HasQueryParameters) { return(new RoutedDataModel(GetDataQueryable)); } int totalSegments = _mapper.PathSegmentsCount; if (pathIsEmpty != (totalSegments == 0)) { return(null); } string[] segments = !pathIsEmpty ? pathInfo.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries) : new string[0]; if (segments.Length != totalSegments) { return(null); } var relativeRoute = new RelativeRoute { PathSegments = segments, QueryString = pageUrlData.QueryParameters }; var filterExpression = GetPredicate(_pageId, relativeRoute); if (filterExpression == null) { return(null); } var dataSet = (IReadOnlyCollection <IData>)_getFilteredDataMethodInfo.MakeGenericMethod(_dataType) .Invoke(null, new object[] { filterExpression }); if (dataSet.Count == 0) { return(null); } if (dataSet.Count > 1) { throw new DataUrlCollisionException(_dataType, relativeRoute); } return(new RoutedDataModel(dataSet.First())); }
public Expression <Func <DateTime, bool> > GetPredicate(Guid pageId, RelativeRoute route) { int year, month, day; if (!int.TryParse(route.PathSegments[0], out year) || year < 0 || year > 10000) { return(null); } if (_format == DateSegmentFormat.Year) { return(date => date.Year == year); } if (!int.TryParse(route.PathSegments[1], out month) || month < 1 || month > 12) { return(null); } if (_format == DateSegmentFormat.YearMonth) { return(date => date.Year == year && date.Month == month); } if (!int.TryParse(route.PathSegments[2], out day) || day <1 || day> DateTime.DaysInMonth(year, month)) { return(null); } return(date => date.Year == year && date.Month == month && date.Day == day); }
internal static IRelativeFilePath AsFilePath(this string pathString, RelativeRoute routingBase) { return(AsFilePath(pathString, () => routingBase.GetFilePath(pathString), ext => routingBase.GetFilePathWithExtension(pathString, ext))); }
private Expression GetPredicate(Guid pageId, RelativeRoute relativeRoute) { var @interface = typeof(IRelativeRouteToPredicateMapper <>).MakeGenericType(_dataType); return(@interface.GetMethod("GetPredicate").Invoke(_mapper, new object[] { pageId, relativeRoute }) as Expression); }
public RoutedDataModel GetRouteDataModel(PageUrlData pageUrlData) { if (pageUrlData.PageId != _pageId) return null; string pathInfo = pageUrlData.PathInfo; bool pathIsEmpty = string.IsNullOrEmpty(pathInfo); int pathInfoSegmentsExpected = _mapper.PathSegmentsCount; if (pathIsEmpty && (pathInfoSegmentsExpected > 0 || !pageUrlData.HasQueryParameters)) { return new RoutedDataModel(GetDataQueryable); } if (pathIsEmpty != (pathInfoSegmentsExpected == 0)) { return null; } string[] segments = !pathIsEmpty ? pathInfo.Split(new[] {'/'}, StringSplitOptions.RemoveEmptyEntries) : Array.Empty<string>(); if (segments.Length != pathInfoSegmentsExpected) { return null; } var relativeRoute = new RelativeRoute { PathSegments = segments, QueryString = pageUrlData.QueryParameters }; var valueProvider = _mapper as AttributeBasedRoutingHelper.IRelativeRouteResover; if (valueProvider != null) { var data = valueProvider.TryGetData(pageUrlData.PageId, relativeRoute); return data != null ? new RoutedDataModel(data) : null; } var filterExpression = GetPredicate(_pageId, relativeRoute); if (filterExpression == null) { return null; } var dataSet = (IReadOnlyCollection<IData>) _getFilteredDataMethodInfo.MakeGenericMethod(_dataType) .Invoke(null, new object[] {filterExpression}); if (dataSet.Count == 0) { return null; } if (dataSet.Count > 1) { throw new DataUrlCollisionException(_dataType, relativeRoute); } return new RoutedDataModel(dataSet.First()); }