【问题标题】:DRY - Stopping repetitition in MVC actions Get, Edit and DeleteDRY - 停止 MVC 操作中的重复获取、编辑和删除
【发布时间】:2012-07-24 15:10:12
【问题描述】:

假设我有一个 CategoriesController 来管理某种类别列表。它有这些动作方法:

public ActionResult Get(Int32 categoryId);

public ActionResult Edit(Int32 categoryId);

[HttpPost]
public ActionResult Edit(Int32 categoryId, CategoryModel model);

public ActionResult Delete(Int32 categoryId);

[HttpPost]
public ActionResult Delete(Int32 categoryId, DeleteModel model);

所有这些方法都运行相同的代码来验证categoryId 是否有效并且类别存在,它从数据库中检索它,并执行访问级别验证。部分验证码直接返回ActionResult,其他则不返回(例如categoryId不存在,则立即返回Http404动作结果,但如果一切正常则归结为特定动作代码。

是减少代码重复的最佳方法吗?

private ActionResult EnsureCategory(Int32 categoryId, out DBCategory dbCategory);

public ActionResult Edit(Int32 categoryId) {
    DBCategory dbCategory;
    ActionResult error = EnsureCategory(categoryId, out dbCategory);
    if( error != null ) return error;

    // this now means that only 3 lines of code will be shared between the Action methods, but it still seems too much.
}

很遗憾 C# 不支持预处理器宏或类似的东西,因为这是使用它们的好地方。除非有更好的方法?

【问题讨论】:

  • 预处理器宏可以替换为 T4 模板。这甚至可以远远超出简单的预处理器

标签: asp.net-mvc dry


【解决方案1】:

使用action filters,在OnActionExecuting 方法中进行验证。

【讨论】:

  • 过滤器的问题是很难将过滤器中的对象和状态传递给操作方法(例如数据库连接或验证检查期间从数据库返回的对象)。
  • @David 如果您需要检查数据库中是否存在对象,您可以简单地抛出异常,然后通过错误处理过滤器返回特定的错误。
  • @David 大多数情况下,您不会将对象和状态从过滤器传递到操作。 Db 连接应由工厂或 DI 提供,验证检查不应从 Db 返回对象。如果您仍然需要这样做,您可以通过普通模型绑定(和参数命名约定)或自定义操作调用程序来完成。
【解决方案2】:

我最终继续使用我在最初的问题中向自己建议的方法。我确实考虑过使用@SteveB 的 T4 模板建议,但我发现 T4 模板有点难用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-19
    • 2011-10-31
    • 1970-01-01
    • 2020-01-27
    • 1970-01-01
    • 2021-01-23
    相关资源
    最近更新 更多