gpt4 book ai didi

c# - 多种类型的 MVC 自定义 ModelBinding

转载 作者:行者123 更新时间:2023-11-30 20:38:05 25 4
gpt4 key购买 nike

我们有一个自定义模型绑定(bind)器,可以将 json 反序列化为对象列表,我想将该模型绑定(bind)器用于多个 View ,每个 View 都使用不同的 View 模型。

我们想要避免的是必须为每个 View 模型注册模型绑定(bind)器,如下所示:

ModelBinders.Binders.Add(typeof(ViewModelOne), new JsonPropertyBinder());
ModelBinders.Binders.Add(typeof(ViewModelTwo), new JsonPropertyBinder());

我们想要做的是让 ViewModel 从基类派生(他们这样做)并注册该基类:

ModelBinders.Binders.Add(typeof(ViewModelBase), new JsonPropertyBinder());

其中 ViewModelOneViewModelTwo 继承自 ViewModelBase。我试过这个但我没有任何运气。那里的问题是,需要自定义绑定(bind)的属性不在基础 ViewModel 中。我们真正想要的是以通用方式实现我的模型绑定(bind)器的优雅解决方案。

我们还有一个自定义属性 [JsonBindable] 在我的 View 模型中要自定义绑定(bind)的属性上,然后我在 Binder 中检查这个属性:

public class JsonPropertyBinder : DefaultModelBinder
{
protected override object GetPropertyValue(ControllerContext controllerContext, System.Web.Mvc.ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor, System.Web.Mvc.IModelBinder propertyBinder)
{
if (propertyDescriptor.Attributes.OfType<Attribute>().Any(x => (x is JsonBindableAttribute)))
{
var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName).AttemptedValue;
return JsonConvert.DeserializeObject(value, propertyDescriptor.PropertyType);
}

return base.GetPropertyValue(controllerContext, bindingContext, propertyDescriptor, propertyBinder);
}
}

我已经尝试将 [ModelBinder] 属性添加到我的 View 模型中,但没有成功。虽然,我不确定我是否喜欢这种方法,因为我想将 Binder 的注册保留在一个地方,而不是分散开来

-- 编辑--我想我可以创建一个从 ViewModelBase 继承的中间类(例如 ViewModelIntermediate),它只包含我想要自定义绑定(bind)的属性,然后有 ViewModelOneViewModelTwo 继承自 ViewModelIntermediate,这样我就可以使用派生的 ViewModel 注册 Binder ,例如

ModelBinders.Binders.Add(typeof(ViewModelIntermediate), new JsonPropertyBinder());

但这似乎是一个笨拙的解决方案。我希望能够一次声明自定义 Binder 并将其与任何 View 模型一起使用 - 而不必将我的类抽象到遗忘。

现在我在想我可能必须声明一个新的默认绑定(bind)器,它继承自 DefaultModelBinder 并在其中包含一些逻辑来检查某些(或自定义)属性并相应地处理它们。类似 this 的东西

最佳答案

我认为您可能正在寻找的是自定义模型绑定(bind)提供程序..基本上是一个 super 抽象,它在给定模型类型的情况下确定要使用的 ModelBinder。

基本上,实现 IModelBinderProvider 接口(interface),并让 GetBinder 方法根据您的条件返回您的模型绑定(bind)器。

public class ViewModelBaseBinderProvider
: IModelBinderProvider
{
public IModelBinder GetBinder(Type modelType)
{
// this or whatever condition you want to apply to determine
// if your model binder needs to be used.
if (typeof(ViewModelBase).IsAssignableFrom(modelType))
return new JsonPropertyBinder();

// this means, the view model did not match our criteria
// let it flow through the usual model binders.
return null;
}
}

一旦您定义了自定义提供程序,请按如下方式在您的应用程序中注册:

ModelBinderProviders.BinderProviders.Add(new ViewModelBaseBinderProvider());

附注nit:为了清楚起见,我会将 JsonPropertyBinder 重命名为 JsonPropertyModelBinder

关于c# - 多种类型的 MVC 自定义 ModelBinding,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35417485/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com