2014-09-22 65 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