ASP.NET MVC:为所有视图提供一个模型

时间:2010-09-21 07:30:52

标签: asp.net-mvc viewmodel

我喜欢django中的模型绑定方式:你以类似Json的方式发送你需要的东西:

'param1': val,
'param2': val

在ASP.NET MVC中,你不能这样做主要是因为C#是一种静态语言。你可以使用ViewData,但这很难看,不推荐。

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

return View(new Model
            {
                Param1 = "asd",
                Param2 = "sdf"
            });

Param1& Param2不是Model类的成员,但Visual Studio将自动生成它们。

现在我的问题是,它会起作用吗?问题是这个Model类中会有很多字段。当我们将它传递给视图时,将仅使用为该视图特定的一小部分字段。明智的表现会不好?

由于

4 个答案:

答案 0 :(得分:2)

如果你的ViewModel上有所有这些未被使用的属性(即null或其他),它实际上不会影响性能。然而,它会影响你的设计。

一般来说,正如你所提议的那样,一个模仿它们的模型有点邪恶并反对分离关注点。 ViewModel的应该非常简单,应该为视图量身定制。 ViewModel不应该为视图提供比视图渲染所需的数据更多或更少的数据。

考虑一下......

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

我会坚持使用单独的视图模型,并且在视图之间存在共同功能的地方,创建一个抽象或基础ViewModel,其他视图模型可以从中扩展。

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

所以而不是做

ViewData["FirstName"] = "Bob";

你可以做到

ViewModel.FirstName = "Bob";

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

答案 1 :(得分:2)

答案 2 :(得分:1)

没有理由不行。

您甚至可以跳过Model类并使用您需要的成员创建一个匿名类型。

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

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

答案 3 :(得分:0)

只需使用dynamic

即可