我正在将MVC 5项目转换为核心。我目前有一个自定义模型绑定(bind)程序,可以用作我的Nhibernate实体模型绑定(bind)程序。我可以选择通过从数据库中取出实体,然后调用基本DefaultModelBinder将请求中的修改数据绑定(bind)到实体中来进行获取和绑定(bind)。
现在,我正在尝试实现IModelBinder ...我可以很好地获取实体。但是,当我不再有基本的DefaultModelBinder调用时,如何调用“默认模型绑定(bind)器”以绑定(bind)表单数据的其余部分?
提前致谢!
最佳答案
您可以执行以下操作:
using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.AspNetCore.Mvc.ModelBinding.Binders;
using Microsoft.Extensions.DependencyInjection;
using Newtonsoft.Json;
namespace Media.Onsite.Api.Middleware.ModelBindings
{
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(options =>
{
// add the custom binder at the top of the collection
options.ModelBinderProviders.Insert(0, new MyCustomModelBinderProvider());
});
}
}
public class MyCustomModelBinderProvider : IModelBinderProvider
{
public IModelBinder GetBinder(ModelBinderProviderContext context)
{
if (context.Metadata.ModelType == typeof(MyType))
{
return new BinderTypeModelBinder(typeof(MyCustomModelBinder));
}
return null;
}
}
public class MyCustomModelBinder : IModelBinder
{
public Task BindModelAsync(ModelBindingContext bindingContext)
{
if (bindingContext == null)
{
throw new ArgumentNullException(nameof(bindingContext));
}
if (bindingContext.ModelType != typeof(MyType))
{
return Task.CompletedTask;
}
string modelName = string.IsNullOrEmpty(bindingContext.BinderModelName)
? bindingContext.ModelName
: bindingContext.BinderModelName;
ValueProviderResult valueProviderResult = bindingContext.ValueProvider.GetValue(modelName);
if (valueProviderResult == ValueProviderResult.None)
{
return Task.CompletedTask;
}
bindingContext.ModelState.SetModelValue(modelName, valueProviderResult);
string valueToBind = valueProviderResult.FirstValue;
if (valueToBind == null /* or not valid somehow*/)
{
return Task.CompletedTask;
}
MyType value = ParseMyTypeFromJsonString(valueToBind);
bindingContext.Result = ModelBindingResult.Success(value);
return Task.CompletedTask;
}
private MyType ParseMyTypeFromJsonString(string valueToParse)
{
return new MyType
{
// Parse JSON from 'valueToParse' and apply your magic here
};
}
}
public class MyType
{
// Your props here
}
public class MyRequestType
{
[JsonConverter(typeof(UniversalDateTimeConverter))]
public MyType PropName { get; set; }
public string OtherProp { get; set; }
}
}
关于c# - 在ASP.net MVC核心中替换DefaultModelBinder,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50893324/