【问题标题】:Model Binder for a custom property type自定义属性类型的模型绑定器
【发布时间】:2019-01-23 12:57:58
【问题描述】:

在 ASP.NET Core 项目中,我有以下操作:

public async Task<IActionResult> Get(ProductModel model) {
}

public class ProductModel {
  public Filter<Double> Price { get; set; }
}    

我有一个 Filter 基类和一个 RangeFilter,如下所示:

public class Filter<T> { }

public class RangeFilter<T> : Filter<T> { 
  public abstract Boolean TryParse(String value, out Filter<T> filter);  
}

我将字符串 ("[3.34;18.75]") 作为价格传递给操作。

我需要创建一个ModelBinder,在其中使用TryParse 方法尝试将String 转换为RangeFilter&lt;Double&gt; 以定义ProductModel.Price 属性。

如果TryParse 失败,例如返回false,则ProductModel.Price 属性变为空。

如何做到这一点?

【问题讨论】:

    标签: c# asp.net-core


    【解决方案1】:

    如果您愿意将解析方法移到静态类中,这将变得更加可行。

    解析器

    public static class RangeFilterParse
    {
        public static Filter<T> Parse<T>(string value)
        {
            // parse the stuff!
            return new RangeFilter<T>();
        }
    }
    
    public abstract class Filter<T> { }
    
    public class RangeFilter<T> : Filter<T> { }
    

    型号

    public class ProductModel
    {
        [ModelBinder(BinderType = typeof(RangeModelBinder))]
        public Filter<double> Price { get; set; }
    }
    

    活页夹

    public class RangeModelBinder : IModelBinder
    {
        public Task BindModelAsync(ModelBindingContext bindingContext)
        {
            try
            {
                var input = bindingContext.ValueProvider.GetValue(bindingContext.ModelName).ToString();
                var inputType = bindingContext.ModelType.GetTypeInfo().GenericTypeArguments[0];
    
                // invoke generic method with proper type
                var method = typeof(RangeFilterParse).GetMethod(nameof(RangeFilterParse.Parse), BindingFlags.Static);
                var generic = method.MakeGenericMethod(inputType);
                var result = generic.Invoke(this, new object[] { input });
    
                bindingContext.Result = ModelBindingResult.Success(result);
                return Task.CompletedTask;
            }
            catch(Exception) // or catch a more specific error related to parsing
            {
                bindingContext.Result = ModelBindingResult.Success(null);
                return Task.CompletedTask;
            }
        }
    }
    

    【讨论】:

    • 如果加载有效负载 [FromBody] 将无法正常工作,永远不会触发活页夹
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-07
    相关资源
    最近更新 更多