我已经学习ASP.NET MVC几个月了。我已经了解了视图和控制器以及模型和内容。要设计视图,我们总是需要一个模型。 通常,模型只是一个我们用数据填充并传递给视图的类。我在这里有一个问题:模型本身应该做一些计算,还是应该只是愚蠢?
例如,我有一个网站,我按Book
s加载User
s。我的模型类如下:
public class FormViewModel
{
public User MyUser {get; set;}
public Books UserBooks {get; set;}
//Constructor here.
public FormViewModel(User _user, Books _userBooks)
{
this.MyUser=_user;
this.UserBooks=_userBooks;
}
}
这个类不会做任何东西 - 它只是一个模板。现在,如果我按如下方式修改代码:
public class FormViewModel
{
public User MyUser {get; set;}
public Books UserBooks {get; set;}
//Constructor here.
public FormViewModel(User _user)
{
this.MyUser=_user;
this.UserBooks=_user.GetBooks();
}
}
收集Book
的取决于选择了哪个User
。现在,它更容易使用。
根据MVC模式和实践,我只想知道什么是好方法。
答案 0 :(得分:5)
您希望将所有业务逻辑和数据验证分离到模型中。通常包括“分组”数据集等,或按某些标准过滤数据。
您希望将所有对模型中这些方法的调用分开,控制器负责检索模型并从模型发送数据。然后,控制器将适用的数据集传递到视图中。
帮助程序是视图用于执行表示逻辑(非业务逻辑或验证)的逻辑,例如打印菜单等。
View是您将使用Helpers的地方(或者不是,他们不需要正确使用MVC,但他们确实“帮助”:p)将HTML,CSS和JS写入浏览器。您还可以将常用的视图模块分成可包含在多个视图中的部分视图。
您可以进一步将事物分离到ViewModel中,但是您将超出“严格”MVC。在这种情况下,您将使用ViewModel来帮助视图与模型交互 - 基本上ViewModel是模块化控制器。在这种情况下,控制器会比它已经做的少得多。
但是,对于Web应用程序来说,这通常是过度的。因为Web应用程序具有单个执行流程(请求),所以将事物分离为ViewModel变得不必要。但是,在GUI代码中,ViewModel变得更加有用(因为GUI只有一个执行流程)。
您总是希望将业务逻辑分为Model,period。请记住,您不应该将控制器与模型耦合 - 这样您就可以在其他控制器的其他地方使用您的模型,甚至将其作为Web服务公开。
希望这会有所帮助 :)
答案 1 :(得分:1)
一般来说,这种工作应该在模型中完成。这有几个原因。首先,如果获取用户书籍需要数据库连接,您不希望从视图中执行此操作 - 它只会减慢速度。要记住的另一件事是可能有多个视图,您需要在所有视图(Web客户端,可能是富客户端等)中复制该代码。
在MVC模式中,视图应该是“哑”的部分。这样可以在需要时更轻松地使用多个视图和更改视图。在不需要视图的情况下测试代码也更容易,因此您可以在不启动Web客户端的情况下测试模型。
杰夫
答案 2 :(得分:1)
这是“愚蠢”的观点。它只是显示被操纵的数据。
控制器只是从模型中获取视图中的数据......再一次,控制器只是介于两者之间。
模型可以完成一切。它存储数据并包含操作它的类和方法。
答案 3 :(得分:1)
你可以通过几种方式实现,但我想说最简单的方法是将你试图访问的用户的引用标识符传递给控制器操作(如下所示)并让它做所有数据访问调用。
public void GetUserAndDetails(Guid userId) { ... }
然后,在此控制器操作中,您可以查找该用户的用户详细信息和书籍,在视图模型实例上设置属性并将其返回到要访问的视图。
FormViewModel model = new FormViewModel();
model.MyUser = GetUser(userId);
model.UserBooks = GetUserBooks(userId);
return View(model);
这种方式视图仍然是愚蠢的(应该是这样)并且模型相对简单。这也有助于测试目的。
希望这有帮助。
答案 4 :(得分:1)
如果您的视图模型与您的域模型不同,则不应将域模型映射到viewmodel内的viewmodel。它会使viewmodel类负责多个事情。您可以在控制器或服务层中进行映射。
答案 5 :(得分:1)
结帐this。您在谈论 VIEW 模型,而不是域模型。这是个很大的差异。视图模型应该是愚蠢的,它只是数据的占位符,允许您的视图更强类型。域模型必须是您应用的核心,它必须包含所有业务逻辑。
答案 6 :(得分:0)
MVC本身就是一种模式。我真的没有任何ASP.NET MVC的经验,但曾多次使用MVC模式。有时,MVC适用于心跳,纪念,状态等其他开发模式......
答案 7 :(得分:0)
模型不允许使用业务逻辑!这是一个糟糕的设计! 您的逻辑必须在控制器中并且更准确:将您的逻辑放入助手(助手可能使用您的BLL和/或DAL),然后在您的控制器中使用助手。