public override void Process(TagHelperContext context, TagHelperOutput output)
        {
            bool canHaveNames = ViewContext.GenerateNames();

            output.TagName = "input";
            output.Attributes.Add("type", "hidden");
            Type type = Encrypted ? typeof(EncryptedJsonTransformation <>) : typeof(JsonTransformation <>);

            type = type.MakeGenericType(new Type[] { For.ModelExplorer.ModelType });
            IBindingTransformation trasf = Activator.CreateInstance(type) as IBindingTransformation;

            trasf.Context = ViewContext.HttpContext;
            string res = type.GetMethod("Transform").Invoke(trasf, new object[] { For.Model }) as string;

            output.Attributes.Add("value", res);
            if (!canHaveNames)
            {
                if (!string.IsNullOrWhiteSpace(Name))
                {
                    output.Attributes.Add("name", Name);
                }
                else
                {
                    output.Attributes.Add("name", string.Empty);
                }
                if (!string.IsNullOrWhiteSpace(Id))
                {
                    output.Attributes.Add("id", Id);
                }
                else
                {
                    output.Attributes.Add("Id", string.Empty);
                }
            }
            else
            {
                string name     = combinePrefixes(For.Name, TransformationsRegister.GetPrefix(type));
                string fullName = ViewContext.ViewData.GetFullHtmlFieldName(name);
                if (string.IsNullOrWhiteSpace(Name))
                {
                    output.Attributes.Add("name", fullName);
                }
                else
                {
                    output.Attributes.Add("name", Name);
                }
                if (string.IsNullOrWhiteSpace(Id))
                {
                    output.Attributes.Add("id", TagBuilder.CreateSanitizedId(fullName, IdAttributeDotReplacement));
                }
                else
                {
                    output.Attributes.Add("id", Id);
                }
            }
            base.Process(context, output);
        }
        public static RenderingScope <I> Transform <M, S, I, D>(this IHtmlHelper <M> h, Expression <Func <M, S> > expression, IBindingTransformation <S, I, D> transform)
        {
            if (expression == null)
            {
                throw new ArgumentNullException(nameof(expression));
            }
            if (transform == null)
            {
                throw new ArgumentNullException(nameof(transform));
            }
            transform.Context = h.ViewContext.HttpContext;
            S model = default(S);

            try
            {
                model = expression.Compile().Invoke(h.ViewData.Model);
            }
            catch { }

            var pres   = transform.Transform(model);
            var prefix = TransformationsRegister.GetPrefix(transform.GetType());

            prefix = combinePrefixes(ExpressionHelper.GetExpressionText(expression), prefix);
            return(Scope <I>(h, prefix, pres));
        }
Esempio n. 3
0
        private async Task innerBinding(ModelBindingContext bindingContext, Type fctype, Type fdtype, Type fitype, string index)
        {
            var    httpContext     = bindingContext.HttpContext;
            var    elementMetadata = metadataProvider.GetMetadataForType(fitype);
            object model           = null;

            if (fctype == null)//subclass! First bind main class,
            //and then extra properties defined in subclass
            {
                bindingContext.Model = Activator.CreateInstance(fitype);
                await inner.BindModelAsync(bindingContext);

                if (!bindingContext.Result.IsModelSet)
                {
                    return;
                }
                model = bindingContext.Result.Model;
                bindingContext.Result = new ModelBindingResult();
                elementMetadata       = new DiffMetaData(elementMetadata, bindingContext.ModelMetadata);
            }


            string                    modelPrefix = string.IsNullOrEmpty(bindingContext.ModelName) ? index : bindingContext.ModelName + "." + index;
            string                    fieldName   = bindingContext.FieldName;
            ModelBindingResult        result;
            ValidationStateDictionary childValidationlState;

            using (bindingContext.EnterNestedScope(
                       modelMetadata: elementMetadata,
                       fieldName: fieldName,
                       modelName: modelPrefix,
                       model: model))
            {
                await getChildBinder(elementMetadata).BindModelAsync(bindingContext);

                result = bindingContext.Result;
                childValidationlState = bindingContext.ValidationState;
            }

            if (result.IsModelSet)
            {
                var validator = httpContext.RequestServices.GetService <IObjectModelValidator>();
                //var options = httpContext.RequestServices.GetService<IOptions<MvcOptions>>();
                //foreach (var prov in options.Value.ModelValidatorProviders) {
                validator.Validate(bindingContext.ActionContext, childValidationlState, modelPrefix, result.Model);
                //}
                //foreach(var pair in modelState)
                //{
                //    bindingContext.ModelState.Add(pair);
                //}
                if (fctype != null)
                {
                    IBindingTransformation trasf = Activator.CreateInstance(fctype) as IBindingTransformation;
                    trasf.Context = httpContext;
                    var fres = fctype.GetMethod("InverseTransform").Invoke(trasf, new[] { result.Model });
                    bindingContext.Result = ModelBindingResult.Success(fres);
                    return;
                }//no trasformation result.Model is a subclass of the required type
                else
                {
                    bindingContext.Result = ModelBindingResult.Success(result.Model);
                    return;
                }
            }
            return;
        }