asp.net mvc绑定字符串到ienumerable <int> </int>

时间:2009-10-07 10:27:48

标签: asp.net-mvc binding

只是想知道asp.net mvc中是否有内置的东西,我可以覆盖特定成员的绑定方式。

例如,假设我有一个表单:

<form ...>
  <input type="text" name="Things" />
  ...
</form>

我有处理回发的控制器操作:

public ActionResult MyPostbackAction(IEnumerable<int> things)
{
  ...
}

并在字段中输入以下数据:“1,20,30,50”(不包括引号)。

当然这不起作用,将字符串转换为一系列整数的操作究竟是怎样的?所以我希望能够“提示”我想要它绑定这个值的绑定器......如:

public ActionResult MyPostbackAction([SequenceBinder(",")]IEnumerable<int> things)
{
  ...
}

序列绑定器是绑定提示,它通过分隔符中断传入值,并将绑定委托回绑定基础结构,以便它可以处理将一系列字符串绑定到IEnumerable中。

我认为这是我需要实际构建的东西,可能是通过创建一个新的默认模型绑定器,首先绑定到提示系统。

只是想知道这是否已经存在,无论是内置还是社区。

提前致谢, 斯蒂芬。

2 个答案:

答案 0 :(得分:3)

据我所知,唯一可以做到这一点的方法是通过实现IModelBinder界面来创建自定义绑定器。

举个例子(其中一个)见: http://davidhayden.com/blog/dave/archive/2008/09/08/CustomModelBinderMoreUIValidationASPNETMVC.aspx

不要忘记在global.asax

中注册

编辑:考虑下面的评论,您可以做的是正常绑定字段,然后让操作过滤器负责处理。

[ProcessField]
public ActionResult MyPostbackAction([Bind(Exclude="IEnumerableField")] ViewModel data) {
    ...
}

我排除了模型中的IEnumerable字段,因此如果有人修改了POST请求,它就无法自动绑定。

然后,操作过滤器可以负责将字符串解析为IEnumerable。

答案 1 :(得分:2)

如果你想避免编写自己的自定义模型绑定器,你可以求助的一件事是各种各样的“伪属性”,以欺骗DefaultModelBinder做你想要的。例如,

public class SomeEntity
{
    private List<int> _Things;
    public IEnumerable<int> Things
    {
        get { return _Things; }
    }
    public string MvcThings
    {
        set
        {
            _Things = value
                        .Split(',')
                        .Select(e => int.Parse(e.Trim()))
                        .ToList();
        }
        get
        {
            return String.Join(", ",
                _Things.Select(e => e.ToString()).ToArray());
        }
    }
}

然后,您可以在HTML表单字段和操作方法参数中引用MvcThings(以逗号分隔的字符串形式)。另一方面,您的模型可以使用其首选的IEnumerable<int>。请注意,我的特定LINQ可能不是最优雅的,但这应该给你的想法。您还需要注意int.Parse上的异常,但可以根据需要进一步验证/优化。

祝你好运!

相关问题