예제 #1
0
        public Task BindModelAsync(ModelBindingContext bindingContext)
        {
            bindingContext.ThrowIfNull(nameof(bindingContext));

            object model;

            if (bindingContext.HttpContext.Request.QueryString.HasValue)
            {
                var queryStringParameters = bindingContext.HttpContext
                                            .Request
                                            .Query
                                            .ToDictionary(pair => pair.Key, pair => pair.Value.ToString());

                var jsonString = JsonConvert.SerializeObject(queryStringParameters);

                var settings = new JsonSerializerSettings
                {
                    ContractResolver = new CustomResolver()
                };

                model = JsonConvert.DeserializeObject(jsonString, bindingContext.ModelType, settings);
            }
            else
            {
                model = Activator.CreateInstance(bindingContext.ModelType);
            }

            BindRouteDataToModel(bindingContext, model);

            bindingContext.Model = model;

            bindingContext.Result = ModelBindingResult.Success(bindingContext.Model);

            return(Task.CompletedTask);
        }
        public Task BindModelAsync(ModelBindingContext bindingContext)
        {
            bindingContext.ThrowIfNull(nameof(bindingContext));

            IViewModel          model = null;
            ValueProviderResult value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);

            //value is n
            if (!value.Any())
            {
                return(null);
            }

            var passedModel = value;

            if (passedModel != null && bindingContext.ModelType.IsAssignableFrom(passedModel.GetType()))
            {
                //route already available and of the correct type so return it.
                return(null);
            }

            string modelData = string.IsNullOrEmpty(passedModel.FirstValue) ? "/" : passedModel.FirstValue;

            //return null if modeldata is not set.
            if (modelData == null)
            {
                return(null);
            }

            //generate a Cache key for the current model.
            //try to get model out of HttpContext.Items[], incase the same model is request multiple times during
            //a single request.
            string key = MODEL_KEY_FORMAT.FormatString(modelData);

            //model = bindingContext.HttpContext.Items[key] as IViewModel;
            if (model == null)
            {
                model = modelData.StartsWith("tcm:") ?
                        _contentProvider.BuildViewModel(new TcmUri(modelData)) :
                        _contentProvider.BuildViewModel(modelData);

                if (model != null && !bindingContext.ModelType.IsAssignableFrom(model.GetType()))
                {
                    //Model is incorrect, so remove
                    model = null;
                }

                bindingContext.HttpContext.Items[key] = model;
            }
            //if (model is IRenderable)
            //    controllerContext.RouteData.DataTokens["area"] = ((IRenderable)model).MvcData.Area;

            //Todo: WTF... this doesn't make sense; Bug in Microsoft.AspNetCore.Mvc???
            bindingContext.Result = ModelBindingResult.Success(model);
            //Todo: implemenet async
            return(Task.FromResult(ModelBindingResult.Success(model)));
        }
예제 #3
0
        public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
        {
            bindingContext.ThrowIfNull("BindingContext");
            controllerContext.ThrowIfNull("ControlContext");

            var      request = controllerContext.HttpContext.Request;
            WordList list    = WordListConfig.Lists[WordListConfig.ENGLISH_AS_A_SECOND_LANGUAGE];
            var      board   = Board.InitiliseBoard(list);

            for (int row = Board.BOARD_START_INDEX; row <= Board.BOARD_END_INDEX; row++)
            {
                for (int column = Board.BOARD_START_INDEX; column <= Board.BOARD_END_INDEX; column++)
                {
                    string letter = GetA <string>(bindingContext, string.Format("[{0}][{1}].Cell.Letter", row, column));
                    if (!letter.IsNullOrEmpty())
                    {
                        board.GetCell(column, row).Letter = letter[0];
                    }
                }
            }
            return(new BoardModel(board, list));
        }
예제 #4
0
        public Task BindModelAsync(ModelBindingContext bindingContext)
        {
            bindingContext.ThrowIfNull();

            var modelName = bindingContext.ModelName;

            var valueProviderResult = bindingContext.ValueProvider.GetValue(modelName);

            if (valueProviderResult == ValueProviderResult.None)
            {
                return(Task.CompletedTask);
            }

            var value = valueProviderResult.FirstValue;

            if (string.IsNullOrEmpty(value))
            {
                return(Task.CompletedTask);
            }

            bindingContext.Result = ModelBindingResult.Success(value.Trim());
            return(Task.CompletedTask);
        }
예제 #5
0
        public Task BindModelAsync(ModelBindingContext bindingContext)
        {
            bindingContext.ThrowIfNull(nameof(bindingContext));

            ISitemapItem model = null;
            //navType & navLevels are set on the 'RouteData' Metadata field on the component template.
            //and passed as routeparameters to the action.
            string navType       = null;
            int    navLevels     = 0;
            int    navStartLevel = -1;

            ValueProviderResult value               = bindingContext.ValueProvider.GetValue("navType");
            ValueProviderResult navLevelsResult     = bindingContext.ValueProvider.GetValue("navLevels");
            ValueProviderResult navStartLevelResult = bindingContext.ValueProvider.GetValue("navStartLevel");

            if (value.Any())
            {
                navType = value.FirstValue;
            }

            string requestUrlPath = bindingContext.HttpContext.Request.Path.Value;

            ////Filename should be removed. the data published from Tridion doesnt include the filename into the url's
            ////i.e. for url '/product/index.html' published content from Tridion contains: '/products/'
            //var fileName = Path.GetFileName(requestUrlPath);
            //if (!fileName.IsNullOrEmpty())
            //    requestUrlPath = requestUrlPath.Replace(fileName, string.Empty);

            if (navLevelsResult.Any())
            {
                int.TryParse(navLevelsResult.FirstValue, out navLevels);
            }
            if (navStartLevelResult.Any())
            {
                int.TryParse(navStartLevelResult.FirstValue, out navStartLevel);
            }

            //generate a Cache key for the current model.
            //try to get model out of HttpContext.Items[], incase the same model is request multiple times during
            //a single request.
            string key = MODEL_KEY_FORMAT.FormatString(navType, requestUrlPath, navLevels, navStartLevel);

            model = bindingContext.HttpContext.Items[key] as ISitemapItem;

            if (model == null)
            {
                switch (navType?.ToLower())
                {
                case "children":
                    model = _navigationProvider.GetChildren(requestUrlPath, navLevels, navStartLevel);
                    break;

                case "path":
                    model = _navigationProvider.GetPath(requestUrlPath);
                    break;

                default:
                    model = _navigationProvider.GetAll(navLevels);
                    break;
                }
                bindingContext.HttpContext.Items[key] = model;
            }
            //Todo: WTF... this doesn't make sense; Bug in Microsoft.AspNetCore.Mvc???
            bindingContext.Result = ModelBindingResult.Success(model);
            //Todo: implemenet async
            return(Task.FromResult(ModelBindingResult.Success(model)));
        }