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)); }
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; }