1)可能是的,但更好的方法是使用数据注释在视图模型上。
2) 一种模型就可以了。模型应该代表一个整体对象,在本例中是“用户”。如果每个视图所需的信息差异很大,则将它们分成视图模型。
3)不知道你的意思。 MVC(以及一般的 ASP.NET)基于 HTTP 协议,因此无国籍的。因此,当您点击 URL 时,就会分配一个控制器,然后根据代码的需要更新对象 - 这包括数据库连接。然后,当请求完成时,一切都消失了(无论如何托管资源)。尽量不要与“模型”这个词混淆。它不是一个物理实体,而是编程模型的一个区域。
4)一般来说,你的“模型”是你的Repository/DAL/ORM,它包装了你的底层数据库,代表了你的领域模型。您的视图不应该与域有关。这是你的控制器/模型的工作。您的视图应该满足其需要,仅此而已。这就是为什么根据经验,永远不要直接绑定到 ORM 模型,而是使用 ViewModel。
编辑-回应评论中的问题:
抱歉...对于1,数据注释建议在模型上执行验证,但是 OpenId.Identifier 还提供了一些可以验证输入的函数(例如 TryParse),因此执行所有验证会更加一致在模型上或者验证的“地点”通常不那么严格吗?
将数据注释放在视图模型它们是为使视图的生活更轻松而创建的模型的表示。数据注释不应放在实际模型实体(实体框架、L2SQL 等)上。数据注释应该用于输入验证(密码比较、字符长度、电话号码、电子邮件地址等)。业务验证应该在域中完成。我想说 OpenId 是一项服务,而不是域的一部分。如果它们有一些验证函数,您可以将这些调用包装在自定义数据注释中并将它们放置在您的 ViewModel 上。这将是一种干净且一致的方法。
对于 3,我同意 HTTP 协议是无状态的,但如果我理解正确的话,cookie 是维护状态的一种方法,并且该模型提供了另一种方法。
你说得对,cookie 是维护状态的一种方式。其常见用途是表单身份验证票证。另一种是会话。TempData使用Session(以一种聪明的方式——自动弹出)。该模型不是一种“替代方式”——它不维护状态。下面将详细讨论这一点。
在应用程序编程中,状态(即对象)通常在应用程序的整个生命周期中是持久的,因此,如果我要在控制台应用程序中创建模型,那么只要存在对它的引用,它就会存在。因此,当您说“对象是新的”时,这是否意味着模型对象已经实例化(就像在控制台应用程序中一样)并且我只是“更新”它,或者这是否意味着我构造了一个新模型?
在控制台应用程序中 - 你的权利。只要控制台应用程序正在运行,对象就处于活动状态。但在 ASP.NET MVC Web 应用程序中,“父级”是 ASP.NET 工作线程,在收到请求时分配。所有必需的对象(控制器、数据库连接、存储库、域对象)都是 ASP.NET 工作线程的“子级”这个线程,如果有道理的话。一旦该线程消失,所有相关对象也消失。
再次强调,模型没有“神奇的实例化”Model是域的整体视图/表示,通常由域模型(实体、业务逻辑)和存储库组成。
一个例外是“模型绑定”。当您将表格提交给[HttpPost]
强类型化为“模型”的操作(应该是 ViewModel)。 ASP.NET MVC(通过反射)将根据 HTTP POST 中的字段构建此“模型”。
当您执行“UpdateModel”之类的操作时,所做的就是更新您通过模型绑定进入操作方法所提供的对象。没有实际的数据库正在更新。
不知道我还能说什么。您似乎对“模型”感到困惑。我可以建议你拿一本史蒂文·桑德森的书吗专业 ASP.NET MVC 2 框架 http://apress.com/book/view/1430228865书。这太棒了,从头到尾解释了一切——用简单的术语,然后加快步伐,这样你在本书结束时就成为了专家。