Asp.net mvc asp.net mvc将字符串绑定到ienumerable

Asp.net mvc asp.net mvc将字符串绑定到ienumerable,asp.net-mvc,binding,Asp.net Mvc,Binding,我只是想知道asp.NETMVC中是否内置了一些东西,我可以覆盖特定成员的绑定方式 例如,假设我有一个表单: <form ...> <input type="text" name="Things" /> ... </form> 我有一个控制器动作来处理回发: public ActionResult MyPostbackAction(IEnumerable<int> things) { ... } 并在字段中输入以下数据:1、20、3

我只是想知道asp.NETMVC中是否内置了一些东西,我可以覆盖特定成员的绑定方式

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

<form ...>
  <input type="text" name="Things" />
  ...
</form>
我有一个控制器动作来处理回发:

public ActionResult MyPostbackAction(IEnumerable<int> things)
{
  ...
}
并在字段中输入以下数据:1、20、30、50,不包括引号

当然这是行不通的,将字符串转换为整数序列的操作究竟是如何操作的?因此,我希望能够“提示”绑定器我希望它如何绑定此值。。比如:

public ActionResult MyPostbackAction([SequenceBinder(",")]IEnumerable<int> things)
{
  ...
}
其中,sequence binder是一个绑定提示,它通过分隔符打断传入值,并将绑定委托回绑定基础结构,以便它可以处理将字符串序列绑定到IEnumerable中的操作

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

只是想知道这是否已经存在,无论是内置的还是由社区提供的

提前感谢,,
Stephen。

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

有关许多示例中的一个示例,请参见:

别忘了在global.asax中注册它

编辑:考虑到您下面的评论,您可以做的是将字段绑定为普通字段,然后使用操作过滤器处理

[ProcessField]
public ActionResult MyPostbackAction([Bind(Exclude="IEnumerableField")] ViewModel data) {
    ...
}
我排除了模型中的IEnumerable字段,因此如果有人修改POST请求,它不能自动绑定


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

据我所知,唯一的方法是通过实现IModelBinder接口创建自定义绑定

有关许多示例中的一个示例,请参见:

别忘了在global.asax中注册它

编辑:考虑到您下面的评论,您可以做的是将字段绑定为普通字段,然后使用操作过滤器处理

[ProcessField]
public ActionResult MyPostbackAction([Bind(Exclude="IEnumerableField")] ViewModel data) {
    ...
}
我排除了模型中的IEnumerable字段,因此如果有人修改POST请求,它不能自动绑定


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

如果您不想编写自己的自定义模型绑定器,可以使用一个排序的伪属性来欺骗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。请注意,我的特殊LINQ可能不是最优雅的,但这应该给你一个想法。您还需要注意int.Parse上的异常,但这可以根据需要进一步验证/优化


祝你好运

如果您不想编写自己的自定义模型绑定器,可以使用一种伪属性来欺骗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。请注意,我的特殊LINQ可能不是最优雅的,但这应该给你一个想法。您还需要注意int.Parse上的异常,但这可以根据需要进一步验证/优化


祝你好运

嗨,Sean,构建一个特定的绑定器的唯一问题是我需要接管整个模型的绑定,实际上我只想管理单个属性/参数的绑定方式。Gah抱歉Dean,hit肯定是搞错了,完全没有注意到,现在就去睡觉,但我会在早上检查你的想法!干杯。嗨,肖恩,构建一个特定的绑定器的唯一问题是,我需要接管整个模型的绑定,实际上我所要做的就是管理单个属性/参数的绑定方式。啊,对不起,迪恩,hit一定是搞错了,完全没有注意到,现在就去睡觉,但我会在早上检查你的想法!干杯。我在这里偶然遇到了一些差不多一年前的类似问题,这可能会让其他问题变得更优雅?关于如何做这样的事情的想法。。。我在这里遇到了一个差不多一年前的类似问题,这可能会让其他问题变得更加优雅?关于如何做这样的事情的想法。。。