将基类属性值分配给派生类

时间:2013-05-03 13:18:04

标签: c# asp.net-mvc-4

我有一个基础模型和从中派生出来的视图模型。

基本型号

public class Feed
{
public int Id { get; set; }
public string Name { get; set; }
public string Url { get; set; }
}

派生模型

public class FeedViewModel :  Feed
{
   public bool EditMode { get; set; }    
}

数据访问层

public Feed GetFeed(){
   --db code to retreive all feed
}

控制器

public FeedController : Controller
{
   public ActionResult Index()
   {
        var data = DAL.GetFeed();
        var model = new FeedViewModel{ EditMode = true };

         model.Id = data.Id;
         model.Name = data.Name;
         model.Url = data.Url;   //This is working

       //But i dont want like this, coz i cant reassign all the proerties again. Is there any other easy way like this
        model = (FeedViewModel)data;
    } 
 }

我不想再将所有属性值重新分配给派生模型。相反,我正在寻找任何其他简单的方法?有什么想法吗?

2 个答案:

答案 0 :(得分:2)

我建议使用合成而不是继承:

public class FeedViewModel
{
    public bool EditMode { get; set; }    
    public Feed Feed { get; set; }
}

然后:

var data = DAL.GetFeed();
var model = new FeedViewModel { EditMode = true, Feed = data };

从根本上说,我不希望视图模型与它是视图模型的模型相同 - 我希望能够使用该模型,但我不会期望为它使用继承。

如果您愿意,视图模型可以通过委托公开视图的属性 - 可能包含属性更改通知。

编辑:另一种选择(可能也不适用 - 我们不知道你在这个项目中可以改变多少)是让你的GetFeed方法在DAL中是通用的:

public Feed GetFeed<T>() where T : Feed, new()
{
   --db code to retreive all feed
}

然后你可以用:

来调用它
var model = DAL.GetFeed<FeedViewModel>();
model.EditMode = true;

答案 1 :(得分:0)

使用AutoMapper

像这样创建一个AutoMapperConfig类:

public class AutoMapperConfig
{
    public static void CreateMaps()
    {
        // Feed domain / view model mappings
        Mapper.CreateMap<FeedViewModel, Feed>()
        Mapper.CreateMap<Feed, FeedViewModel>();            
    }
}

CreateMaps()调用Global.asax方法,在应用程序启动时注册映射。

现在,在您的Action中,您需要做的就是:

public FeedController : Controller
{
   public ActionResult Index()
   {
        var data = DAL.GetFeed();
        var model = Mapper.Map<Feed, FeedViewModel>(data);
        model.EditMode = true;

        return View(model)
    } 
 }

然后在其他一些行动中你只需要反转过程

[HttpPost]
public ActionResult SomeOtherAction()
{
    FeedViewModel model = new FeedViewModel();
    TryUpdateModel(model);

    if (ModelState.IsValid)
    {
        var feed = Mapper.Map<FeedViewModel, Feed>(model);
        DAL.UpdateFeed(feed);
    }

    return View(model)
}