0

我有一个自定义模型绑定器,它采用逗号分隔列表并清除所有空值,然后将其传递给默认模型绑定器。这在 ASP.NET MVC Preview 2 中有效,但是当我升级到 RC2 时,下面的代码将无法编译,因为 ValueProvider 的接口只有一个 GetValue() 方法,没有 [] 访问器。我在下面做的事情是否可以通过绑定上下文中的一些其他机制?我宁愿不必为这种简单的情况创建一个完整的模型活页夹。主要目标是当值绑定到 List<SomeEnum> 时,将跳过任何空值。

public class EnumListModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var result = bindingContext.ValueProvider[bindingContext.ModelName];
        string[] rawValues = (string[])result.RawValue;
        var newValues = new List<string>();
        foreach (string value in rawValues)
        {
            if (!String.IsNullOrEmpty(value))
            {
                newValues.Add(value);
            }
        }

        string newValuesAttempted = String.Join(",", newValues.ToArray());
        // overwrite the ValueProviderResult with the cleaned up csv list
        // this is the part I'm not sure how to implement using the interface
        bindingContext.ValueProvider[bindingContext.ModelName] = 
           new ValueProviderResult(newValues.ToArray(), newValuesAttempted, result.Culture);

        return System.Web.Mvc.ModelBinders.Binders.DefaultBinder.BindModel(controllerContext, bindingContext);
    }
}
4

2 回答 2

1

确切地说,使用GetValue()而不是在[]这里有什么问题?它做同样的事情。但是ValueProvider现在是接口,接口不能有索引器。因此,GetValue()

将您的代码更改为:

var result = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);

不过,我有点惊讶下一行的演员阵容一直有效。似乎高度依赖于用户实际提交的内容以及特定的属性类型是什么。不过,这与您的问题无关。

于 2010-02-25T14:20:26.790 回答
0

由于 ValueProvider 集合是只读的,因此这里没有太多的解决方案。相反,我最终使用了自定义模型绑定器

有没有办法让 DefaultModelBinder 在绑定到 List<Enum> 时忽略空项

于 2010-03-01T17:47:08.907 回答