示例#1
0
 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);
            }
示例#4
0
 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());
        }