【问题标题】:Shared Function Issue in MVC.NETMVC.NET 中的共享函数问题
【发布时间】:2015-05-16 12:14:37
【问题描述】:

我正在开发一个 MVC.NET 项目。我对这项技术有一些疑问。 我有一些控制器之间通用的功能(或操作)。在控制器之间共享功能的一种方法是创建一个BaseController 并从Controller 扩展此控制器并从BaseController 扩展另一个控制器,但它有一些问题。困扰我的问题之一是用户可以请求此 url www.MySite.com/BaseController(对吗?),如果我使用 Authorize 属性,我的所有操作都需要授权。在不同的控制器中使用共享功能的另一种方法是什么。我需要那些分享功能使用ViewBag。你能帮帮我吗?

【问题讨论】:

  • 您的BaseController 不应包含任何public ActionResult 方法,因此用户无法导航到任何内容。只需创建可以从其他控制器调用的受保护的辅助方法
  • @StephenMuecke 但是当他尝试访问此控制器时,他会注意到 404 错误。因为找不到任何动作。没关系吗?
  • 用户也可以导航到/ThisUrlDoesNotExist并得到一个404错误:) - 你为什么要导航到一个不存在的页面
  • @StephenMuecke ph 是的,你是对的 :) 我认为 Controller not found 和 action not found 代码是不同的,但它们都会产生 404 错误。谢谢你,伙计:)但是分享功能没有其他方法吗?

标签: asp.net-mvc asp.net-mvc-4


【解决方案1】:

我会推荐你​​一种不同的方法。

首先,我不是继承的忠实粉丝。人们经常误解这个概念并使用它来避免代码复制。继承的目的实际上是为了能够以独特的方式处理具有共同祖先的不同类的对象,并利用多态性。我想我宁愿选择composition。我会在你的控制器和模型之间引入另一层。该层将被称为业务逻辑,将涵盖所有复杂的数据处理和决策。通过组合,我只需在控制器中拥有来自业务逻辑层的类的实例,并将特定的作业委托给它们。这样,控制器将只是封装在业务逻辑层中的实际业务操作的入口点。

要考虑的另一件事是为共享的操作创建一个单独的控制器。如果它们是共享的,那么它们可能与它们的控制器并没有真正的关系,并且在某种程度上违反了separation of concerns rule?

您可以做的另一件事是定义自定义路由。通过这种方式,您可以像我上面描述的那样提取具有共享功能的控制器,并且仍然为用户提供优雅的 url。像这样的:

public static void RegisterRoutes(RouteCollection routes)
{
    ...
     routes.MapRoute(
         name: "Route1",
         url: "Controller1/Action1",
         defaults: new { controller = "CommonController", action = "CommonAction"}
     ); 
     routes.MapRoute(
         name: "Route2",
         url: "Controller2/Action1",
         defaults: new { controller = "CommonController", action = "CommonAction"}
     ); 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 2013-11-20
    • 2012-09-16
    • 2015-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多