Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.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# NET中的MVC:如何不复制类?_C#_.net_Model View Controller_Architecture_Model - Fatal编程技术网

C# NET中的MVC:如何不复制类?

C# NET中的MVC:如何不复制类?,c#,.net,model-view-controller,architecture,model,C#,.net,Model View Controller,Architecture,Model,我在模型中有一个Person类,希望将其15个属性指定给视图中的标签。视图不应访问模型。这意味着控制器将处理创建人员的操作。视图如何从控制器获取这些人员属性?如果控制器包含Person类型的成员,则视图可以执行以下操作: lblFirstName.Text=controller.Person.FirstName lblLastName.Text=controller.Person.LastName lblCity.Text=controller.Person.City 但是,视图仍在直接访问模型

我在模型中有一个Person类,希望将其15个属性指定给视图中的标签。视图不应访问模型。这意味着控制器将处理创建人员的操作。视图如何从控制器获取这些人员属性?如果控制器包含Person类型的成员,则视图可以执行以下操作:

lblFirstName.Text=controller.Person.FirstName

lblLastName.Text=controller.Person.LastName

lblCity.Text=controller.Person.City

但是,视图仍在直接访问模型(即Person)。控制器可以有自己的Person类,将模型的所有Person属性复制到其中,并使视图使用如上所述的语法。但这种设计有很多重复之处。有什么建议吗


顺便说一下,这是winform。该模型也是一个单独的项目/DLL。什么是DTO

模型中的Person属性具有特殊的逻辑,我不希望视图出现问题。例如,视图可能执行以下操作:

字符串fn=myController.Firstname

并且由于FirstName属性中的逻辑而引发异常。因此,Person对象的控制器轻量级(复制)版本不会有任何这些问题,因为它的属性只是字符串


还请注意,视图将需要对模型的引用,以处理来自控制器的隐藏人员属性。我不喜欢它。

这个人可能在视图数据中。我个人并不认为视图访问控制器已经获得的模型类型的实例有什么大问题,所以我个人会让视图直接看到
Person

如果需要很多深层属性,例如视图模型中的
person.Foo.Bar.Blip
obj.Blip
,则可能需要将模型展平为视图模型

如果您处理的是单个对象,另一种选择是将每个值分别放入字典中,但这有点混乱


另一种选择是滥用匿名类型;但不要这样做!我甚至不想在这里重复这些细节,这太糟糕了;但是。

即使您使用的类是具有属性的对象,或者更严格地说是构造函数和一堆只读属性,您也可以将模型中的关注点分离开来。起初,它可能看起来像是在复制代码,但它成为了一种非常灵活的方式来处理不同类型的视图和模型的预期结果。

我不确定为什么不能在视图中共享模型。没有必要重复,而且你似乎也不需要使用DTO,所以我只需经过国家安全袋中的人,你就会很好

我想你在考虑你的服务。您不希望您的视图访问您的服务,但您的控制器会将其打包,然后发送到视图。就简单的模型而言,通过IMHO发送数据确实没有退步。唯一的另一种方法是,在与视图相同的项目中有一个模型,该模型本质上是模型的副本,但只包含要发送的值。在这种情况下,我可以看到好处,但再一次……您的示例并没有那么专业。

稍微偏离主题(关于MVC),但关于您的问题:

为什么不使用一个不那么麻烦的解决方案呢?如果只需为15个标签指定15个值,则可以为控制器提供一个索引属性或方法,该属性或方法使用标签对象的设计时名称作为键,使用字典或实体属性名称的反射或大开关语句从模型中检索适当的值:

foreach(Control control in myLabelsPanel.Controls)
{
    Label label = control as Label;
    if(label != null)
    {
        label.Text = myController.TextForKey[label.Name];
    }
}
编辑:我只是忘了添加一点,我不认为访问模型实体类的视图是件坏事。毕竟,它们是模型,它们可以成为ViewModel的一部分(如果您使用该范例),MVC鼓励视图了解模型(但不是相反)