MVC3表单使用list参数向Action提交单个输入

时间:2011-12-23 20:46:18

标签: asp.net-mvc-3 input defaultmodelbinder

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

提交的值(如Fiddler中所示)是:

items=1,35,346,547

控制器操作如下:

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

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

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

建议?

1 个答案:

答案 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>,则会始终尝试绑定。

根据你的评论:目前没有办法可以说Default Model Binder这样做是因为他试图绑定属性而不知道你何时想要绑定{{1何时没有。

您可以看到DefaultModelBinder here

的来源