MVC使用从另一个视图中使用的基本视图模型派生的viewmodel

时间:2012-04-09 13:25:46

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

这是针对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页面的额外属性。

对此有何想法?

感谢您的时间......

2 个答案:

答案 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。