我搜索过高低,所以希望有人可以帮助我。我有一节课:
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;
}
答案 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)
}
然后默认模型绑定将自动绑定帖子上的集合。