我有一个第三方控件,它使用一个隐藏的输入字段来存储整数列表。该控件在整个站点中以多种形式使用。
提交的值(如Fiddler中所示)是:
items=1,35,346,547
控制器操作如下:
public ActionResults SomeAction(IEnumerable<int> items) {...}
正如预期的那样,DefaultModelBinder无法解析整数列表。鉴于我确实能够更改输入值的格式,是否有一种格式可以让默认模型绑定器为我解析这个?
我可以轻松地将动作更改为具有字符串参数并自己处理解析,但是我希望模型绑定器能够为我执行此操作。我也可以拦截表单提交并将数据/数据类型刮换/更改为JSON(或其他格式),但我真的想避免这种方法。另一个选择是创建一个自定义模型绑定器,但这看起来可能有点过分。
建议?
答案 0 :(得分:2)
No Default 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)
您可以在global.asax
ModelBinders.Binders.Add(typeof(List<int>), new MyCustomModelBinder());
但请注意,如果您的操作方法中有List<int>
,则会始终尝试绑定。