MVC6自定义IModelBinder,Beta8改变了吗?

时间:2015-10-19 09:12:20

标签: c# asp.net .net asp.net-core

我有这个自定义IModelBinder正在运行,但我已经卸载了beta5和beta7,所以我使用的是最新的beta8。似乎代码已完全改变,我似乎无法在github上找到任何vNext代码来查看更改。

有人可以告诉我如何更新这个以使用beta8,或者给我一个github源代码的URL?

public class CommaDelimitedArrayModelBinder : IModelBinder
{
    public async Task<ModelBindingResult> BindModelAsync(ModelBindingContext bindingContext)
    {
        var key = bindingContext.ModelName;
        var val = bindingContext.ValueProvider.GetValue(key);
        var result = new ModelBindingResult(null, key, false);

        if (val != null)
        {
            var s = val.FirstValue;

            if (s != null)
            {
                var elementType = bindingContext.ModelType.GetElementType();
                var converter = TypeDescriptor.GetConverter(elementType);
                var values = Array.ConvertAll(s.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries),
                    x => { return converter.ConvertFromString(x != null ? x.Trim() : x); });

                var typedValues = Array.CreateInstance(elementType, values.Length);

                values.CopyTo(typedValues, 0);

                result = new ModelBindingResult(typedValues, key, true);
            }
            else
            {
                // change this line to null if you prefer nulls to empty arrays 
                result = new ModelBindingResult(Array.CreateInstance(bindingContext.ModelType.GetElementType(), 0), key, true);
            }
        }

        return result;
    }

}

我唯一的错误是ModelBindResult不接受任何构造函数参数,所有参数都是只读的,所以它们不能被设置?那么如果我不能在其上设置任何属性,我应该如何返回一个ModelBindingResult?

1 个答案:

答案 0 :(得分:1)

测试版8中ModelBindingResult的源代码为here。它有静态方法,它接受参数并返回一个新实例,例如:

public static ModelBindingResult Success(string key, object model)
{
   if (key == null)
   {
      throw new ArgumentNullException(nameof(key));
   }

   return new ModelBindingResult(key, model, isModelSet: true);
}