MVC 如何让模特保持苗条 [英] MVC How to keep a model skinny

查看:23
本文介绍了MVC 如何让模特保持苗条的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

看完这个视频后,我想知道我是否使用了错误的控制器.控制器究竟应该包含哪些内容?

After watching this video, I am wondering if I am using my controllers wrong. What exactly should a controller contain?

对于我的博客,我有一个 post 控制器,它具有以下方法:创建展示列表加载后喜欢不喜欢

For my blog, I have a post controller which has methods: create show list loadPost like dislike

而我的帖子模型只有一些访问规则、验证规则和关系信息.网络上是否有 MVC 应用的示例?

Whereas my post model only has a few access rules, validation rules and relation information. Are there any examples of a MVC app on the web?

推荐答案

我强烈推荐阅读http://www.lostechies.com/blogs/jimmy_bogard/archive/2009/04/24/how-we-do-mvc.aspx

这是我不完整的控制器不应该做的清单:

Here's my incomplete list of what controller shouldn't do:

  • 将发布数据绑定到视图模型 - 不,模型绑定器应该这样做
  • 从存储库中获取实体 - 我会说不,模型绑定器或操作过滤器应该
  • 计算一些东西 - 不,视图模型或实体应该
  • 授权 - 也许,但最好传递给属性/过滤器
  • 验证 - 只有当它从实体/域(即业务规则)返回时,才应自动处理视图模型(表示)验证(活页夹等)

应该做的:

  • 获取绑定的、经过验证的视图模型作为输入
  • 调用领域层,从视图模型传递数据
  • 处理域层错误
  • 根据视图模型/域结果路由到适当的操作/视图

不好:

public ActionResult PlaceOrder(Guid orderid)
{
  if (HttpContext.Session["user"] == null)
    return Redirect("Login");
  if (!ValidOrderId(orderid)) return Redirect();
  var order = cart.Get(orderid);
  if (order == null) { ViewData["orderid"] = orderid; return View("Select"); }
  order.Status = OrderStatus.Placed;
  foreach (var item in order.Items)
    item.Update();
  var cart = Cart.GetCurrent();
  cart.Save(order);
  return Redirect("Show", "Orders", new { orderid = orderid });
}

[Authorize]
[ModelStateToTempData]
// OrderViewModel.Id/OrderViewModel.Instance - validates id, 
// gets it from repository, set Instance or ModelState error
public ActionResult PlaceOrder(OrderViewModel<Order> order)
{
  if (!ModelState.IsValid)
     return View("Select", order);
  var order = order.InstanceFromDatabase;
  _injectedCart.SetOrderPlaced(order);
  return RedirectToAction<OrdersController>(c => c.Show(order));
}

顺便说一下,我很少看到好的 MVC 示例,包括 NerdDinner.它们都处理动作内部的业务逻辑,没有视图模型等等.这对于他们的意图通常是可以的 - MVC 功能演示 - 但它不应该被视为好的设计示例.一个或多或少的好例子是 CodeCampServer,以及配套书籍 ASP.NET MVC In Action.但并非没有缺点(例如贫血领域模型).

And by the way, I rarely see good MVC examples, including the NerdDinner. They all deal with business logic inside actions, no view models, and so on. This is usually OK for what they are intendet for - MVC features demonstration - but it shouldn't be taken as good design examples. A more-or-less good examples is CodeCampServer, along with accompanion book ASP.NET MVC In Action. But not without its drawbacks (anemic domain model, for example).

但如果不尝试遵循领域驱动设计,而是有一个简单的数据驱动需求,事情会更容易.

But if do not try to follow domain driven design, and instead have a simple data-driven requirements, things can be easier for you.

这篇关于MVC 如何让模特保持苗条的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆