src/ZKEACMS/ModelBinder/WidgetTypeModelBinder.cs
(开头部分) 12KB这里只显示每个文件的开头 60 行。登录后可以解锁完整代码。
/* http://www.zkea.net/
* Copyright (c) ZKEASOFT. All rights reserved.
* https://github.com/aspnet/Mvc/blob/dev/src/Microsoft.AspNetCore.Mvc.Core/ModelBinding/Binders/ComplexTypeModelBinder.cs
* http://www.zkea.net/licenses */
using Easy;
using Easy.MetaData;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Reflection;
using System.Threading.Tasks;
using ZKEACMS.Widget;
namespace ZKEACMS.ModelBinder
{
public class WidgetTypeModelBinder : IModelBinder
{
private IDictionary<Type, Func<object>> _modelCreator;
private readonly ModelBinderProviderContext _modelBinderProviderContext;
public WidgetTypeModelBinder(ModelBinderProviderContext modelBinderProviderContext)
{
_modelBinderProviderContext = modelBinderProviderContext;
_modelCreator = new Dictionary<Type, Func<object>>();
}
public Task BindModelAsync(ModelBindingContext bindingContext)
{
var assembly = bindingContext.ValueProvider.GetValue("AssemblyName");
var viewModelType = bindingContext.ValueProvider.GetValue("ViewModelTypeName");
var widgetViewModelType = WidgetBase.KnownWidgetModel[$"{assembly.FirstValue},{viewModelType.FirstValue}"];
var viewConfig = ServiceLocator.GetViewConfigure(widgetViewModelType);
var modelMetadataProvider = bindingContext.HttpContext.RequestServices.GetService<IModelMetadataProvider>();
bindingContext.ModelMetadata = modelMetadataProvider.GetMetadataForType(widgetViewModelType);
if (!CanCreateModel(bindingContext))
{
return Task.CompletedTask;
}
return BindModelCoreAsync(bindingContext, viewConfig);
}
private async Task BindModelCoreAsync(ModelBindingContext bindingContext, ViewConfigure viewConfigure)
{
if (bindingContext.Model == null)
{
bindingContext.Model = CreateModel(bindingContext);
}
for (var i = 0; i < bindingContext.ModelMetadata.Properties.Count; i++)
{
var property = bindingContext.ModelMetadata.Properties[i];
if (!CanBindProperty(bindingContext, property))
{
continue;
后面还有 281 行代码,解锁后查看完整代码
24 小时内免费解锁 3 个项目,之后 1 算力/个。 规则说明
AI 解读 AI
登录后可用,每次 10 算力,解读结果公开显示在下面。
还没有人解读过这个文件。