1

我有一个第三方控件,它利用单个隐藏输入字段来存储整数列表。该控件在整个站点中以多种形式使用。

提交的值(在 Fiddler 中显示)为:

items=1,35,346,547

控制器动作如下所示:

public ActionResults SomeAction(IEnumerable<int> items) {...}

正如预期的那样,DefaultModelBinder 无法解析整数列表。鉴于我确实能够更改输入值的格式,是否有一种格式可以使默认模型绑定器为我解析它?

我可以轻松地将操作更改为具有字符串参数并自己处理解析,但是我希望模型绑定器为我执行此操作。我还可以拦截表单提交并将数据/数据类型刮取/更改为 JSON(或其他格式),但是我真的很想避免这种方法。另一种选择是创建一个自定义模型绑定器,但这似乎有点矫枉过正。

建议?

4

1 回答 1

2

描述

不,默认模型绑定器不能做到这一点。您可以创建一个自定义模型绑定器来处理它。假设您的输入字段名称是items我的示例应该可以工作,如果没有将其更改为正确的名称。

样本

public class MyCustomModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        List<int> result = new List<int>();

        var value = bindingContext.ValueProvider.GetValue("items").AttemptedValue;

        foreach (string i in value.Split(",".ToCharArray()))
        {
            int a;
            if (Int32.TryParse(i, out a))
                result.Add(a);
        }
        
        return result;
    }
}

public ActionResult SomeAction([ModelBinder(typeof(MyCustomModelBinder))] List<int> list)

更多信息

更新

您可以在以下位置注册您的自定义模型绑定器global.asax

  ModelBinders.Binders.Add(typeof(List<int>), new MyCustomModelBinder());

List<int>但请注意,如果您的 Action Method 中有,这将始终尝试绑定。

根据您的评论:目前,无法说默认模型绑定器可以做到这一点,因为他尝试绑定属性并且不知道您何时要绑定List<int>,何时不绑定。

你可以看到DefaultModelBinder这里的来源

于 2011-12-23T21:15:26.693 回答