C# 将基类属性值指定给派生类
我有一个基础模型和一个从中派生的视图模型 基本型号C# 将基类属性值指定给派生类,c#,asp.net-mvc-4,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 class Feed { p
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 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;
}
}
控制器
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;
}
}
我不想将所有属性值重新分配给派生模型。相反,我在寻找其他简单的方法?有什么想法吗?我建议使用合成而不是继承:
public class FeedViewModel
{
public bool EditMode { get; set; }
public Feed Feed { get; set; }
}
然后:
从根本上说,我不希望视图模型与它作为视图模型的模型相同——我希望能够使用该模型,但我不希望对其使用继承
视图模型可以通过委托公开视图的属性,如果您愿意的话-可能带有属性更改通知
编辑:另一种选择(可能也不适用-我们不知道您在该项目中可以做多少更改)是使您的GetFeed
方法在DAL中通用:
public Feed GetFeed<T>() where T : Feed, new()
{
--db code to retreive all feed
}
public提要GetFeed(),其中T:Feed,new()
{
--检索所有提要的db代码
}
然后,您可以使用以下命令调用它:
var model = DAL.GetFeed<FeedViewModel>();
model.EditMode = true;
var model=DAL.GetFeed();
model.EditMode=true;
使用
创建一个AutoMapperConfig
类,如下所示:
public class AutoMapperConfig
{
public static void CreateMaps()
{
// Feed domain / view model mappings
Mapper.CreateMap<FeedViewModel, Feed>()
Mapper.CreateMap<Feed, FeedViewModel>();
}
}
然后在其他一些行动中,你只需颠倒这个过程
[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)
}
[HttpPost]
公共行动结果其他行动()
{
FeedViewModel模型=新的FeedViewModel();
TryUpdateModel(model);
if(ModelState.IsValid)
{
var feed=Mapper.Map(模型);
DAL.更新进料(进料);
}
返回视图(模型)
}
@谢谢,谢谢你的建议。但很抱歉,我想在视图模型中使用更多属性扩展基础模型,因此我无法使用合成。还有其他想法吗?@SSS:那只是说“我不能使用合成,因为我想使用继承”——它没有给出任何你想使用继承的理由。我再次强烈建议不要在这里继承遗产。我不希望代码将视图模型视为原始模型,那么为什么要使用继承呢?@是的,我理解,但我目前在维护项目中,实现的FeedViewModel
是来自Feed
的派生对象,如果我改为composition,则会涉及大量重构工作。所以我需要我所要求的。希望你understand@SSS:如果你不能用好的方式做事情,你就必须用你已经见过的丑陋的方式来做——将属性从一个对象复制到另一个对象。这种丑陋往往发生在设计糟糕的对象模型中。@SSS:最终的答案是,没有任何东西可以满足您更改现有对象类型的明显愿望。您需要更改GetFeed
,以便它可以返回FeedViewModel
,或者您需要将属性从一个对象复制到另一个对象。这可能在FeedViewModel
构造函数中,它可能使用AutoMapper。。。各种选择。但是你根本无法改变现有对象的类型。太好了!我很高兴这有帮助。