Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVC使用从另一个视图中使用的基础viewmodel派生的viewmodel_C#_Asp.net Mvc 3 - Fatal编程技术网

C# MVC使用从另一个视图中使用的基础viewmodel派生的viewmodel

C# MVC使用从另一个视图中使用的基础viewmodel派生的viewmodel,c#,asp.net-mvc-3,C#,Asp.net Mvc 3,这是针对asp.net mvc3项目的。我有两个视图和它们各自对应的视图模型 Home.aspx具有viewmodel HomeVM HomeChild.aspx的视图模型为HomeChildVM 现在HomeChildVM是从HomeVM派生而来的,它还有一些在自己的视图中使用的属性。我的控制器有一个返回主视图的操作方法和另一个返回HomeChild视图的操作方法。这两个操作方法都调用一个返回HomeVM类型的业务方法。然后,我的操作方法将同样的结果返回到aspx视图 return View(

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

Home.aspx具有viewmodel HomeVM

HomeChild.aspx的视图模型为HomeChildVM

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

return View(objHomeVM);
现在,我不再编写另一个业务方法并重复所有代码以返回另一个viewmodel类型ie 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页面的额外属性

有什么想法吗


感谢您抽出时间……

只需在您的视图模型上做一个说明。我将为这两个视图创建一个视图模型,即使在这两个视图中都使用了一些属性。如果必须删除HomeVM中的一个属性,您将怎么做?然后HomeChildVM崩溃了

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

已更新

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

Mapper.CreateMap<Customer, CustomerDto>();  // Create the map
然后使用它会像这样:

Mapper.Map(customer);

您是否考虑过在业务方法之外创建所需的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。

您将此问题标记为ASP.NET MVC3,但看起来您使用的是以前版本的MVC?如果是MVC3项目,我建议您使用以.cshtml结尾的视图。使用视图开始文件为视图指定母版页。代码看起来不一样,你不再使用@。你能解释一下你所说的派生是什么意思吗?HomeChildVM是从HomeVM继承的(
公共类HomeChildVM:HomeVM
),还是HomeChildVM只是有一组与HomeVM类似的属性?阿德里安:是的,公共类HomeChildVM:HomeVM就是我所说的派生,另外,HomeChildVM还有一些自己的属性。布伦丹:如果我有选择的话,但这是我中途加入的一个项目,所以现在提出这些改变已经太迟了。此外,我一直想知道,过度使用@的实际好处是什么。。我看到的唯一好处是使用@有更多的例子,但这只是一个小小的不便。在其他场景中,这一点很好。但在这种情况下,这几乎不可能成为问题。子视图是主视图的扩展。父视图有一个显示记录的表。子视图将一些筛选条件添加到同一视图以及与应用程序的完全不同区域相关的其他一些附加视图详细信息中。如果有任何东西从父对象传出,它也会从子对象传出。那么自动映射器是唯一的方法吗?我一直在寻找c#Automapper的本土产品,我所能想到的就是它。如果你不想用,我建议你写下来。Automapper使您的代码更少。如果视图模型有30个属性,则可以想象所有代码。使用AutoPAPER,您可以在两行代码中绘制每个RHIN。谢谢。但我认为,对于这两个类,一个从另一个继承而来的类将有一种内置的.net方式来将一个类转换为另一个类。这是行不通的。该业务方法在内部处理objHomeVM类型的对象,并返回objHomeVM。如果它能够基于一些参数返回另一个类型,这意味着我必须使用老式的方法,使用反射或其他方法来确定传入的类型,并相应地仅设置该特定类型并返回传入的相同类型。这将涉及重新测试和重新测试特定的业务方法。我只是想扩展现有的功能
Mapper.Map(customer);
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;
   ...
}