我想做这样的事情:
[HttpPost]
public JsonResult Submit(Person UpdatedPerson)
{
//Find the original Person that the model was bound against
//Update the collection's reference to reflect the changes
//from the posted model version
Person original = PersonCollection
.SingleOrDefault(p=>p.Id == UpdatedPerson.Id);
if(original!=null)
{
//update the value from PersonCollection
//doesn't work, of course
original = UpdatedPerson;
}
}
我目前正在这样做:
[HttpPost]
public JsonResult Submit(Person UpdatedPerson)
{
//Find the index into PersonCollection for the original
//model bound object, use the index to directly mutate the
//PersonCollection collection
int refIndex = -1;
for(int i=0;i<PersonCollection.Length;i++)
{
if(PersonCollection[i].Id == UpdatedPerson.Id)
{
refIndex = i;
break;
}
}
if(refIndex >= 0)
{
PersonCollection[refIndex] = UpdatedPerson;
}
}
感觉我在这里缺少一些简单的东西,完成我所追求的东西应该不会那么麻烦。
做这种事情的最佳做法是什么?
答案 0 :(得分:2)
执行此操作时:
original = UpdatedPerson;
您只是将引用分配给original
,因此original
现在指向UpdatedPerson
指向的同一对象。这就是为什么你丢失了从集合中检索到的对象的参考值。
尝试改为分配各个字段。
答案 1 :(得分:1)
在第一个示例中,您进行了变量声明:
Person original;
original
变量是参考。
然后将其分配给列表中的某个项目
然后你会打这样的电话:
original = UpdatedPerson;
在此调用中,您将更新变量引用,而不是集合中的任何内容。
你可能想要做的是这样的事情(Presuming Person是一个类,而不是一个struct):
original.UpdateValuesToMatch(UpdatedPerson);
但是您必须在person对象上创建这样的方法。
或者在第二种方法中,您可以简化:
if(PersonCollection[i].Id == UpdatedPerson.Id)
{
refIndex = i;
break;
}
}
if(refIndex >= 0)
{
PersonCollection[refIndex] = UpdatedPerson;
}
到
if(PersonCollection[i].Id == UpdatedPerson.Id)
{
PersonCollection[i] = UpdatedPerson;
break;
}
}
答案 2 :(得分:1)
您可以使用FindIndex
[HttpPost]
public JsonResult Submit(Person UpdatedPerson)
{
//Find the index into PersonCollection for the original
//model bound object, use the index to directly mutate the
//PersonCollection collection
int refIndex = PersonCollection.FindIndex(x => x.Id == UpdatedPerson.Id);
if (refIndex != -1)
PersonCollection[refIndex] = UpdatedPerson;
}