只是想知道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中。
我认为这是我需要实际构建的东西,可能是通过创建一个新的默认模型绑定器,首先绑定到提示系统。
只是想知道这是否已经存在,无论是内置还是社区。 p>
提前致谢, 斯蒂芬。
答案 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上的异常,但可以根据需要进一步验证/优化。