我已经在一年多以前发表了这篇文章,并且我认为更新它是有道理的,因为它获得了很多关注。
我要么错过了一些东西,要么微软真的搞砸了MVC。我从事过Java MVC项目,它们干净整洁。但是,这是一个完全困惑的IMO。在线示例(如NerdDinner)和ASP.Net上讨论的项目太基础了,因此为什么它们“简单”地工作。请问这听起来是否定的,但这是我到目前为止的经验。
我有一个存储库和一个与该存储库相关的服务。 Controller 调用服务。
我的数据层不是持久性独立的,因为这些类是由SQL metal生成的。因此,我有很多不必要的功能。理想情况下,我想拥有POCO,但是我还没有找到实现该目标的好方法。
*更新:当然,微软并没有搞砸任何事情-我做到了。我不完全了解我可以使用的工具。我所做的主要缺陷是,我选择了一种错误的技术来保留实体。 LINQ to SQL在有状态应用程序中效果很好,因为可以轻松跟踪数据上下文。但是,在无状态上下文中不是这种情况。正确的选择是什么?首先使用实体框架代码或仅将代码很好地工作,但更重要的是,它无关紧要。 MVC或前端应用程序必须不知道数据如何持久保存。 *
创建实体时,可以使用对象绑定(bind):
[HttpPost]
public ActionResult Create(Customer c)
{
// Persistance logic and return view
}
这很棒,MVC在后台进行了一些绑定(bind),一切都“非常好”。
不是“Jolly Good”。客户是一个域模型,更糟糕的是,它依赖于持久性介质,因为它是由SQL金属生成的。我现在要做的是设计域模型,该模型将独立于数据存储或表示层。然后,我将从我的域模型创建 View 模型,并使用它。
我想做一些更复杂的事情,例如-保存链接到客户的订单,似乎一切都中断了:
[HttpPost]
public ActionResult Create(Order o)
{
// Persistance logic and return view
}
要保留顺序,我需要Customer或至少CustomerId。 View 中存在CustomerId,但是到创建方法时,它已经失去了CustomerId。我不想花时间调试MVC代码,因为我无法以任何一种方式在托管环境中对其进行更改。
好吧,抱歉。我现在要做的是根据我要实现的目标创建一个称为NewOrder或SaveOrder或EditOrder的 View 模型。这个 View 模型将包含我感兴趣的所有属性。开箱即用的自动绑定(bind),顾名思义,将绑定(bind)提交的值,并且不会丢失任何内容。如果我想要自定义行为,则可以实现自己的“绑定(bind)”,它将完成工作。
替代方法是使用FormCollection:
[HttpPost]
public ActionResult Create(FormCollection collection)
{
// Here I use the "magic" UpdateModel method which sometimes works and sometimes doesn't, at least for LINQ Entities.
}
这在书籍和教程中都使用过,但是我看不到有替代方法的要点:TryUpdateModel-如果崩溃或模型无效,它将尝试以任何一种方式进行更新。您如何确定这将起作用?
大多数情况下,使用 View 模型自动绑定(bind)。如果不是,则可以覆盖它。您怎么知道它将一直有效?您对它进行单元测试,就可以睡个好觉。
我尝试过的另一种方法是使用ViewModel-具有验证规则的包装对象。这听起来是个好主意,除了我不想向实体类添加注释。这种方法非常适合显示数据,但是在写数据时您会怎么做?
[HttpPost]
public ActionResult Create(CustomViewWrapper submittedObject)
{
// Here I'd have to manually iterate through fields in submittedObject, map it to my Entities, and then, eventually, submit it to the service/repository.
}
**查看模型是前进的好方法。从 View 模型到域模型必须有一些映射代码,然后可以将其传递给相关服务。这不是正确的方法,但这是一种方法。自动映射工具是您最好的 friend ,您应该找到适合您需求的工具,否则您将编写大量的样板代码。**
我错过了什么吗?还是Microsoft MVC3应该这样工作?我看不出这是如何简化事情的,尤其是与Java MVC相比。
很抱歉,这听起来很消极,但这是我到目前为止的经验。我欣赏以下事实:不断改进框架,引入了诸如UpdateModel之类的方法,但是文档在哪里?也许是时候停下来思考一下了吗?我希望我的代码在整个过程中保持一致,但是就目前为止所见,我不相信这是正确的方法。
我喜欢这个框架。有太多的东西要学习,而且没有比以往更令人兴奋的了。应该就网络表单发表另一篇文章。我希望这是有帮助的。
最佳答案
我认为您的问题不是与asp.net MVC有关,而是与您选择一起使用的所有部分有关。
您想要简单而原始吗?
到处使用POCO,并在需要的地方实现存储库。
我没有使用过Java MVC,但是如果您包括如何解决其中的特定问题,那么它会使整个问题看起来不太像是rant。
让我们清除一些误解或误解:
关于c# - MVC 3-这将如何运作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5807669/