我有一个第三方控件,它利用单个隐藏输入字段来存储整数列表。这个控件在整个站点的许多表单上使用。
提交的值(在Fiddler中显示)为:
items=1,35,346,547
控制器动作如下:
public ActionResults SomeAction(IEnumerable<int> items) {...}
正如预期的那样,DefaultModelBinder无法解析整数列表。假设我确实能够更改输入值的格式,那么是否存在一种格式,使默认模型绑定器能够为我解析该格式?
我可以很容易地将动作更改为具有字符串参数并自己处理解析,但是我希望模型绑定器为我做这些。我也可以拦截表单提交并将数据/数据类型刮擦/更改为JSON(或其他格式),但是我真的希望避免这种方法。另一种选择是创建自定义模型绑定器,但这似乎有点过头了。
建议?
描述
不,默认模型绑定器不能这样做。你可以创建一个定制的Model Binder来处理它。假设您的输入字段名称是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)
的更多信息- 在MVC 3中使用IModelBinder自定义模型绑定
- ASP。。MVC自定义模型绑定
- DefaultModelBinder源代码里
您可以在global.asax
中注册您的自定义模型绑定器
ModelBinders.Binders.Add(typeof(List<int>), new MyCustomModelBinder());
,但要注意,如果你的动作方法中有List<int>
,这将总是试图绑定。
根据您的评论:目前没有办法,这使得有可能说默认模型绑定器这样做,因为他试图绑定属性,不知道何时要绑定List<int>
,何时不绑定。
你可以在这里看到DefaultModelBinder
的来源