C# 使用新值更新现有对象
我想知道如何用新值更新现有对象。我有一个具有以下属性的简单帐户对象C# 使用新值更新现有对象,c#,asp.net-mvc,asp.net-mvc-4,C#,Asp.net Mvc,Asp.net Mvc 4,我想知道如何用新值更新现有对象。我有一个具有以下属性的简单帐户对象 public class Account { public int Id {get; set;} public string Forename {get; set;} public string Surname {get; set;} public DateTime RegisterDate {get; set;} public string Occupation {get; set;}
public class Account
{
public int Id {get; set;}
public string Forename {get; set;}
public string Surname {get; set;}
public DateTime RegisterDate {get; set;}
public string Occupation {get; set;}
}
在我的项目中,我有一个简单的编辑方法,允许用户更新他们的名字、姓氏和职业
public ActionResult Edit()
{
return View();
}
[HttpPost]
public ActionResult Edit(Account editFormDetails)
{
var accountDetails = GetAccountDetails(account.Id) //Gets a users existing details from db
return RedirectToAction("Index");
}
是否有一种很好的方法可以使用editFromDetails对象中的新值更新现有对象(accountDetails)?我会做克隆,但是,我的编辑表单中的字段可以保留为空,因此我可能不需要更新。在本例中,我简化了我的对象,使其不那么冗长。任何帮助都很好。使用NuGet安装一个名为
AutoMapper
PM>安装软件包自动映射器
一旦安装,您将需要在希望更新的每个类型之间创建映射,如果类型的属性匹配(如下面的示例所示),那么库将自动将这些属性映射到彼此
void Main()
{
AutoMapper.Mapper.CreateMap<ChangeNameViewModel, User>()
.ForMember(member => member.FirstName, viewModel => viewModel.Condition(source => !string.IsNullOrWhiteSpace(source.FirstName)))
.ForMember(member => member.LastName, viewModel => viewModel.Condition(source => !string.IsNullOrWhiteSpace(source.LastName)));
User user = new User
{
FirstName = "Jane",
LastName = "Doe",
UserId = Guid.NewGuid().ToString()
};
ChangeNameViewModel model = new ChangeNameViewModel
{
FirstName = "John"
};
user = AutoMapper.Mapper.Map<ChangeNameViewModel, User>(model, user);
Console.WriteLine ("First name: {0}", user.FirstName);
Console.WriteLine ("Last name: {0}", user.LastName);
Console.WriteLine ("UserId: {0}", user.UserId);
// Output should be:
// ---------------------------
// First name: John
// Last name: Doe
// UserId: 9fd25bfd-c978-4287-8d3d-890d67834c23
// ---------------------------
}
public class User
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string UserId { get; set; }
}
public class ChangeNameViewModel
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
void Main()
{
AutoMapper.Mapper.CreateMap()
.ForMember(member=>member.FirstName,viewModel=>viewModel.Condition(source=>!string.IsNullOrWhiteSpace(source.FirstName)))
.ForMember(member=>member.LastName,viewModel=>viewModel.Condition(source=>!string.IsNullOrWhiteSpace(source.LastName));
用户=新用户
{
FirstName=“Jane”,
LastName=“Doe”,
UserId=Guid.NewGuid().ToString()
};
ChangeNameViewModel模型=新的ChangeNameViewModel
{
FirstName=“约翰”
};
user=AutoMapper.Mapper.Map(模型,用户);
Console.WriteLine(“名字:{0}”,user.FirstName);
Console.WriteLine(“姓氏:{0}”,user.LastName);
Console.WriteLine(“UserId:{0}”,user.UserId);
//输出应为:
// ---------------------------
//名字:约翰
//姓氏:Doe
//用户ID:9fd25bfd-c978-4287-8d3d-890d67834c23
// ---------------------------
}
公共类用户
{
公共字符串名{get;set;}
公共字符串LastName{get;set;}
公共字符串用户标识{get;set;}
}
公共类ChangeNameViewModel
{
公共字符串名{get;set;}
公共字符串LastName{get;set;}
}
使用NuGet安装名为AutoMapper的库
PM>安装软件包自动映射器
一旦安装,您将需要在希望更新的每个类型之间创建映射,如果类型的属性匹配(如下面的示例所示),那么库将自动将这些属性映射到彼此
void Main()
{
AutoMapper.Mapper.CreateMap<ChangeNameViewModel, User>()
.ForMember(member => member.FirstName, viewModel => viewModel.Condition(source => !string.IsNullOrWhiteSpace(source.FirstName)))
.ForMember(member => member.LastName, viewModel => viewModel.Condition(source => !string.IsNullOrWhiteSpace(source.LastName)));
User user = new User
{
FirstName = "Jane",
LastName = "Doe",
UserId = Guid.NewGuid().ToString()
};
ChangeNameViewModel model = new ChangeNameViewModel
{
FirstName = "John"
};
user = AutoMapper.Mapper.Map<ChangeNameViewModel, User>(model, user);
Console.WriteLine ("First name: {0}", user.FirstName);
Console.WriteLine ("Last name: {0}", user.LastName);
Console.WriteLine ("UserId: {0}", user.UserId);
// Output should be:
// ---------------------------
// First name: John
// Last name: Doe
// UserId: 9fd25bfd-c978-4287-8d3d-890d67834c23
// ---------------------------
}
public class User
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string UserId { get; set; }
}
public class ChangeNameViewModel
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
void Main()
{
AutoMapper.Mapper.CreateMap()
.ForMember(member=>member.FirstName,viewModel=>viewModel.Condition(source=>!string.IsNullOrWhiteSpace(source.FirstName)))
.ForMember(member=>member.LastName,viewModel=>viewModel.Condition(source=>!string.IsNullOrWhiteSpace(source.LastName));
用户=新用户
{
FirstName=“Jane”,
LastName=“Doe”,
UserId=Guid.NewGuid().ToString()
};
ChangeNameViewModel模型=新的ChangeNameViewModel
{
FirstName=“约翰”
};
user=AutoMapper.Mapper.Map(模型,用户);
Console.WriteLine(“名字:{0}”,user.FirstName);
Console.WriteLine(“姓氏:{0}”,user.LastName);
Console.WriteLine(“UserId:{0}”,user.UserId);
//输出应为:
// ---------------------------
//名字:约翰
//姓氏:Doe
//用户ID:9fd25bfd-c978-4287-8d3d-890d67834c23
// ---------------------------
}
公共类用户
{
公共字符串名{get;set;}
公共字符串LastName{get;set;}
公共字符串用户标识{get;set;}
}
公共类ChangeNameViewModel
{
公共字符串名{get;set;}
公共字符串LastName{get;set;}
}
试试ValueInjector:有几个库为您解决了这个问题。ValueInjector、AutoMapper等。但是,我认为您会发现,让编辑表单post为他们不想编辑的值设置null将导致一些问题。请尝试ValueInjector:有几个库为您解决了这个问题。ValueInjector、AutoMapper等。然而,我想你会发现,让编辑表单为他们不想编辑的值发布一个空值会导致一些问题。谢谢你的回答,但是,有可能不映射空值的属性吗?我已经修改了上面的答案。。。现在,如果您的名字或姓氏为空或空白,它将忽略它。如果您发现这已回答您的问题,请将其标记为所选答案。。。谢谢你的回复,但是,能不能不映射空属性?我已经修改了上面的答案。。。现在,如果您的名字或姓氏为空或空白,它将忽略它。如果您发现这已回答您的问题,请将其标记为所选答案。。。谢谢