0

这是一个 asp.net mvc3 项目。我有两个视图和它们自己对应的视图模型。

Home.aspx 有一个视图模型 HomeVM

HomeChild.aspx 有一个作为 HomeChildVM 的视图模型。

现在 HomeChildVM 是从 HomeVM 派生的,并且还有一些属性在它自己的视图中使用。我的控制器有一个返回 Home 视图的操作方法和另一个返回 HomeChild 视图的操作方法。这两种操作方法都调用一个业务方法,该方法返回一个类型为 HomeVM。然后我的操作方法将相同的返回到 aspx 视图。

return View(objHomeVM);

现在,我不再编写另一个业务方法并重新重复所有代码以返回另一个视图模型类型,即 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 页面的额外属性。

对此有什么想法吗?

谢谢你的时间...

4

2 回答 2

0

只是关于您的视图模型的注释。我会为这两个视图创建一个视图模型,即使两者都使用了一些属性。如果您必须删除 HomeVM 中的某个属性,您会怎么做?然后 HomeChildVM 分崩离析。

回到你关于一一分配属性的问题。我建议你看看Auto Mapper。它负责为您映射对象之间的属性。

更新

一旦你有了你的类型和对 AutoMapper 的引用,你就可以为这两种类型创建一个映射:

Mapper.CreateMap<Customer, CustomerDto>();  // Create the map

左边的类型是源类型,右边的类型是目标类型。要执行映射,请使用 Map 方法:

CustomerDto dto = Mapper.Map<Customer, CustomerDto>(customer);

以下是一些示例代码,您可以编写/使用它们在 2 个对象之间进行映射:

public static Customer Map(CustomerEntity entity)
{
     return new Customer
     {
          CustomerId = entity.CustomerId,
          Company = entity.CompanyName,
          City = entity.City,
          Country = entity.Country
     };
}

然后使用它看起来像这样:

Mapper.Map(customer);
于 2012-04-09T13:59:55.873 回答
0

您是否考虑过在业务方法之外创建所需的 ViewModel,然后将 ViewModel 的引用作为 HomeVM 的一种类型传递到您的业务方法中以进行填充?IE:

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;
   ...
}

记住 ViewModel 只是普通的对象。它们唯一的特别之处在于它们被称为 ViewModel。

于 2012-04-09T14:03:13.797 回答