Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用新值更新现有对象_C#_Asp.net Mvc_Asp.net Mvc 4 - Fatal编程技术网

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等。然而,我想你会发现,让编辑表单为他们不想编辑的值发布一个空值会导致一些问题。谢谢你的回答,但是,有可能不映射空值的属性吗?我已经修改了上面的答案。。。现在,如果您的名字或姓氏为空或空白,它将忽略它。如果您发现这已回答您的问题,请将其标记为所选答案。。。谢谢你的回复,但是,能不能不映射空属性?我已经修改了上面的答案。。。现在,如果您的名字或姓氏为空或空白,它将忽略它。如果您发现这已回答您的问题,请将其标记为所选答案。。。谢谢