2014-09-22 109 views
1

我想知道如何用新值更新现有对象。我有以下特性用新值更新现有对象

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"); 
} 

是否有更好的方式来更新现有的对象(accountDetails)与editFromDetails对象的新值?我会做克隆,但是,我的编辑窗体中的字段可以留空,所以我可能不需要更新。我在这个例子中简化了我的对象,以减少冗长。任何帮助都会很棒。

+0

尝试ValueInjecter:https://valueinjecter.codeplex.com/ – 2014-09-22 20:13:59

+3

有几个库已经为您解决了这个问题。 ValueInjector,AutoMapper等等。不过,我认为你会发现编辑表单发布一个null的值,他们不想编辑会导致一些问题。 – 2014-09-22 20:15:28

回答

5

使用的NuGet安装一个库调用AutoMapper

PM>安装,包装AutoMapper

一旦安装,您将需要创建您要更新每个类型之间的映射,如果类型的属性匹配(如我在下面给出的示例中),那么库将自动能够将这些属性映射到彼此...

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; } 
} 
+0

感谢您的回应,但是,是否可以不映射属性为null? – user3529453 2014-09-22 20:57:02

+0

我修改了上面的答案......现在,如果您的名字或姓氏为空或空格,它将忽略它。 – 2014-09-22 22:03:03

+0

如果您发现此问题已回答您的问题,请将其标记为选定的答案...谢谢 – 2014-09-24 13:02:02