表单通过列表参数向Action提交单个输入



我有一个第三方控件,它利用单个隐藏输入字段来存储整数列表。这个控件在整个站点的许多表单上使用。

提交的值(在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的来源

相关内容

  • 没有找到相关文章

最新更新