这是针对asp.net mvc3项目的。我有两个视图和他们自己的相应视图模型。
Home.aspx有一个viewmodel HomeVM
HomeChild.aspx有一个viewmodel作为HomeChildVM。
现在,HomeChildVM派生自HomeVM,并且在自己的视图中使用了更多属性。我的控制器有一个返回Home视图的action方法和另一个返回HomeChild视图的action方法。这两个操作方法都调用一个返回类型为HomeVM的业务方法。然后我的action方法将它返回到aspx视图。
return View(objHomeVM);
现在,不是再编写另一个业务方法并重复所有代码只是为了返回另一个viewmodel类型,即HomeChildVM,我将objHomeVM的属性逐个分配给objHomeChildVM,如下所示:
objHomeChildVM.prop1 = objHomeVM.prop1;
objHomeChildVM.prop2 = objHomeVM.prop2;
然后返回它:
return View(objHomeChildVM);
有没有比通过逐个分配属性更好的方法呢?我认为这是太原始的方式,除非这是唯一的方法。
HomeChild.aspx目前有此页面指令
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<HomeChildVM>" %>
如果我将其更改为HomeVM,那么我将无法使用HomeChildVM具有的仅属于HomeChild.aspx页面的额外属性。
对此有何想法?
感谢您的时间......
答案 0 :(得分:0)
只关注您的视图模型。我会为两个视图创建一个视图模型,即使两者都使用了一些属性。如果你必须删除HomeVM中的一个属性,你打算做什么?然后HomeChildVM崩溃了。
回到你关于逐个分配属性的问题。我建议你看一下Auto Mapper。它负责为您在对象之间映射属性。
<强>已更新强>
获得类型和AutoMapper参考后,您可以为这两种类型创建地图:
Mapper.CreateMap<Customer, CustomerDto>(); // Create the map
左侧的类型是源类型,右侧的类型是目标类型。要执行映射,请使用Map方法:
CustomerDto dto = Mapper.Map<Customer, CustomerDto>(customer);
以下是一些示例代码,您可以编写/使用它们来映射两个对象:
public static Customer Map(CustomerEntity entity)
{
return new Customer
{
CustomerId = entity.CustomerId,
Company = entity.CompanyName,
City = entity.City,
Country = entity.Country
};
}
然后使用它看起来像这样:
Mapper.Map(customer);
答案 1 :(得分:0)
您是否考虑过在业务方法之外创建所需的ViewModel,然后将ViewModel的引用传递给您的业务方法,作为一种HomeVM,要填充?即:
public ActionResult HomeAction()
{
HomeVM objHomeVM = new HomeVM();
BusinessMethod(objHomeVM);
return View(objHomeVM);
}
public ActionResult HomeChildAction()
{
HomeChildVM objHomeChildVM = new HomeChildVM();
BusinessMethod(objHomeChildVM);
return View(objHomeChildVM);
}
private void BusinessMethod(HomeVM objHomeVM)
{
...
objHomeVM.prop1 = prop1;
objHomeVM.prop2 = prop1;
...
}
记住ViewModels只是普通对象。他们唯一特别之处在于他们被称为ViewModels。