Asp.net mvc ASP.NET MVC:所有视图都有一个模型

Asp.net mvc ASP.NET MVC:所有视图都有一个模型,asp.net-mvc,viewmodel,Asp.net Mvc,Viewmodel,我喜欢django中模型绑定的工作方式:以类似Json的方式发送所需的内容: 'param1': val, 'param2': val 在ASP.NETMVC中,您不能这样做,主要是因为C是一种静态语言。您可以使用ViewData,但它很难看,不推荐使用 所以我必须为每个视图创建几十个视图模型:IndexViewModel、AboutViewModel等等。今天我有了一个想法:为什么不创建一个模型类,让Visual Studio生成所有必要的字段?就像在django一样 return View

我喜欢django中模型绑定的工作方式:以类似Json的方式发送所需的内容:

'param1': val,
'param2': val
在ASP.NETMVC中,您不能这样做,主要是因为C是一种静态语言。您可以使用
ViewData
,但它很难看,不推荐使用

所以我必须为每个视图创建几十个视图模型:IndexViewModel、AboutViewModel等等。今天我有了一个想法:为什么不创建一个
模型
类,让Visual Studio生成所有必要的字段?就像在django一样

return View(new Model
            {
                Param1 = "asd",
                Param2 = "sdf"
            });
Param1和Param2不是模型类的成员,但Visual Studio将自动生成它们

现在我的问题是,这行得通吗?问题是在这个模型类中将有很多字段。当我们将其传递给视图时,只会使用为该视图创建的字段中的一小部分。这会是糟糕的表现吗


谢谢

只要使用
动态

就可以了,没有理由不工作

您甚至可以跳过模型类,创建一个只包含所需成员的匿名类型

return View(new { Amount = 108, Message = "Hello" });

使用匿名类型的问题在于,您放弃了视图中的自动完成,因为您将无法根据模型键入视图

如果您的ViewModel上有所有未使用的属性(即null或其他),则不会真正影响性能。然而,它将影响的是您的设计

一般来说,一种按照您的建议来管理所有这些问题的模式有点邪恶,并且不利于分离关注点。ViewModel的应该非常简单,应该根据视图进行定制。ViewModel不应该为视图提供比视图渲染所需数据更多或更少的数据

考虑一下

您有一个通用模型,上面有15个属性,您只设置了其中的一小部分。其他人设计一个新视图并查看模型时,他们可能不知道发送了哪些属性以及在什么条件下设置了这些属性。因此,他们可能试图显示不存在的数据。这不是一个非常干净的方法

我会坚持使用单独的视图模型,如果视图之间有共同的功能,则创建一个抽象或基础视图模型,其他视图模型可以从中扩展

编辑:您可以做的另一件事是使用新的MVC 3(仍在预览中)语法(动态)直接设置ViewData属性,就像它们是属性一样

与其这样做,不如这样做

ViewData["FirstName"] = "Bob";
你能行

ViewModel.FirstName = "Bob";

这将在MVC 3中自动为您提供动态变量。

请查看Orchard项目使用的“可延展”对象模型


使用匿名类型时,我们必须使用'as'关键字强制转换对象。另外,我并没有放弃自动完成,为什么它不起作用呢?事实上,如果你有一个模型类和所有可能的成员,它会起作用。我在考虑使用匿名类型:pI不理解演员阵容的必要性,though@samy,原因如下:事实上,不需要强制转换:)如果您使用上面的匿名对象创建视图,您可以键入,它将输出108。你不会自动完成。但你会有一个很好的观点。我想做的是模仿django的行为。甚至不应该查看Model.cs类,因为它是完全自动生成的。但我会考虑你写的东西。我完全同意viewmodel尽可能简单。完全自动生成是灾难的秘诀。虽然最初更方便(因为您不必预先编写代码),但它将非常脆弱,在出现问题时更难调试,也更难测试。动态的问题是,你没有得到编译器时间检查,动态变量的类型可能会改变,你可能不会注意到。Alex,即使你不看模型,它也是一个可能泄漏的抽象。如果每个人都在没有监督的情况下添加,您可能(这是一个很大的可能,但它是存在的)遇到性能问题,或者在预期和观察到的行为之间出现更严重的差异。想象一下,有人添加一个属性来自动填充两个字段(例如,将字符串拆分为名称和昵称)。这一变化可能会渗透到你不知道的其他部分。如果你提供一些关于你的实际领域的更多信息,我可能会为你的模型结构提出一些想法。但是,一般来说,考虑一下您的模型中是否有您希望从中创建基础模型的共性,并让您的其他模型扩展这些共性。如果不是这样,那么您的数据是不同的,应该属于不同的视图。它的最佳实践是只提供视图所需的数据。没有更多,也没有更少。它仅在ASP.NET MVC 3 Preview 1中受支持,这远远不够稳定。您可以从ViewPage继承视图并将ExpandoObject作为模型传递。感谢您提供的粘土链接,我不知道它,但它非常有趣