儿童收藏的定制模型活页夹

时间:2011-11-10 20:59:23

标签: c# asp.net asp.net-mvc asp.net-mvc-3 asp.net-mvc-2

我搜索过高低,所以希望有人可以帮助我。我有一节课:

public class Person
{
    public string Name { get; set; }
    public ICollection<Toys> { get; set; }
}

我有一个控制器方法:

public ActionResult Update(Person toycollector)
{
....
}

我想绑定到该集合。我意识到我只会获得ID,但我会在我的控制器中处理它。我只需要能够翻阅ID集合。我开始写一个模型绑定器:

public class CustomModelBinder : DefaultModelBinder
    {
        protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor)
        {
            if (propertyDescriptor.PropertyType == typeof(ICollection<Toys>))
            {
                //What do I do here???
            }
}

那么如何从传递给我方法的值构建Toys集合呢?谢谢!

编辑: 看起来我无法将此答案发布到我自己的问题中,所以我只想编辑我的帖子。看起来你要做的就是解析数据并将其添加到模型中,如下所示:

if (propertyDescriptor.PropertyType == typeof(ICollection)) {

            var incomingData = bindingContext.ValueProvider.GetValue("Edit." + propertyDescriptor.Name + "[]");
            if (incomingData != null)
            {
                ICollection<Toy> toys = new List<Toy>();
                string[] ids = incomingData.AttemptedValue.Split(',');
                foreach (string id in ids)
                {
                    int toyId = int.Parse(id);
                    toys.Add(new Toy() { ToyID = toyId });
                }
                var model = bindingContext.Model as Person;
                model.Toys = toys;
            }
            return;
        }

2 个答案:

答案 0 :(得分:3)

您不需要为此设置自定义模型绑定器。

有关完整实现的信息,请参阅this post by Phil Haack,但基本思路是,对于集合中的每个项目,您将创建一个遵循以下命名约定的表单字段:

Toys[index].<FieldName>

因此,例如,如果你想绑定3个玩具对象:

<input type="hidden" name="Toys[0].Id" value="1" />
<input type="hidden" name="Toys[1].Id" value="2" />
<input type="hidden" name="Toys[2].Id" value="3" />

重要的是要考虑所有索引值,不要跳过任何索引。例如,如果您的表单值为Toys[1].<FieldName>,则必须的值为Toys[0].<FieldName>

所有这些都说,根据你需要完成什么,可能更容易简单地绑定到一组ID而不是整个对象。您可以让控制器操作将ID转换为实际模型。

如果您更喜欢更简单的Id-only方法,那么您需要做的就是在请求模型中创建一个字符串/ int / guid(无论您的id是什么)集合对象,然后创建一个或多个字段 all每个Id值具有相同的名称。默认模型绑定器将自动处理从请求中的值创建集合。

答案 1 :(得分:0)

基于上述n个玩具的答案,你必须使用for循环来正确索引,如下所示:

@for(var i = 0; i < Model.Toys.Count; i++)
{
    @Html.HiddenFor(m => m.Toys[i].Id)
}

然后默认模型绑定将自动绑定帖子上的集合。