我有一个基础模型和从中派生出来的视图模型。
基本型号
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;
}
}
我不想再将所有属性值重新分配给派生模型。相反,我正在寻找任何其他简单的方法?有什么想法吗?
答案 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)
}