我可以在BaseController中添加什么东西来使我的MVC生活更简单

时间:2011-11-08 13:29:04

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

我的基本控制器有:

[Authorize(Roles = "sys_admin")]

我希望在控制器中有一个不同的操作,可用于“user”和“sys_admin”。我可以覆盖,我该怎么做?

还有任何关于我可以在基本控制器中放置什么的建议,这可能使我的编码更简单。例如你的基本控制器中有什么?

5 个答案:

答案 0 :(得分:3)

你在每个控制器中使用的任何东西 - 属性,方法,属性等。你将放在任何基类中的相同内容。

答案 1 :(得分:3)

为了补充讨论,我在共享控制器中有一些额外的实用工具方法。我写了一堆供企业使用的小应用程序,所以我尝试尽可能少地重复代码。

  • getContext():将包含用户信息(如IP,主机名,ID等)的对象放在一起,以便进行日志记录。
  • 共享视图/部分内容,例如错误,默认和重定向(用于重定向ajax请求)。
  • RedirectToError():我创建它使用类似于RedirectToAction。我使用info加载一个ErrorObject,将其抛入会话中,然后将Redirect返回到我的错误页面。
  • 常规日志记录和跟踪方法,以便我可以快速将信息吐出到文件中。
  • 我重写OnActionExecuting并检查我的会话是否仍然有效,如果不是,则重定向到登录。可能更好的属性...快速和肮脏。还可以在此处跟踪Url.PathAndQuery以进行调试。
  • 我将使用ajax在视图中使用的任何数据访问操作,例如加载部门列表。
  • 也会覆盖OnException。

这就是我到目前为止所得到的。

答案 2 :(得分:2)

在我的基本控制器中,我实际上放了一些实用工具方法([NonAction])。如果可能的话,我更喜欢通过使用Attributes进行装饰来向控制器添加功能。

最近我的基本控制器有:

  • 一些属性,用于检索有关当前用户的信息(我的应用 具体的信息,而不是User.Identity的东西)
  • 一个简单的protected override void OnException(ExceptionContext filterContext);覆盖,至少记录未处理的异常并具有 某种自动通知
  • 一堆与Cookie相关的方法(WebForms auth cookies management 例如)
  • 声明中有许多有用的标准属性(通常为[Authorize][HandleError][OutputCache])。
  • 动态准备广泛使用的json数据类型的一些标准方法(如果可能,我更喜欢使用带有ErrorCode,ErrorMessage和UserData的标准json对象)。

随着时间的推移,你会发现越来越多的实用程序与你的控制器保持一致,尝试用更简单的程序保存程序集(避免重度依赖),对你的下一个MVC项目来说会很方便。 (助手也是如此,在某种程度上也适用于EditorTemplates)。

对于授权属性部分,我认为最干净的方法是编写自己的AuthorizeAttribute类,特别是NonAuthorizeAttribute。我想我也在SO上看过它。

您还可以使用默认Order的{​​{1}}属性 - 在BaseController和Action中放置不同的Order,以便首先执行Action,但我不记得你是否真的可以打破属性处理链。

此致

微米。

答案 3 :(得分:1)

我们无法告诉你基本控制器中你需要什么,你必须在实现你的控制器时看到这些东西并看到重复代码..不要犹豫将这些东西重构到你的BaseController,并记住,那个也许你应该有2个或更多BaseControllers,或BaseControllers的2层层次结构。

我给你两个提示,我在BaseController中总是有的:

  1. 基于接口的模型绑定的超级有用的辅助方法:
  2. protected T Bind<T, U>()
       where T : U, new()
       where U : class
    {
       T model = new T();
       TryUpdateModel<U>(model);
       return model;
    }
    

    然后,您可以在作为接口实现的不同场景中拥有多个要绑定的属性“集合”,并且简单模型将您的对象(甚至现有对象,来自数据库)与传入值绑定。

    2.如果您使用自定义AcionResults(可能是您的特定Json构建器等),请在BaseController中创建“快捷方式”方法。与View()方法相同的是返回新的ViewResult(...)

    的快捷方式

答案 4 :(得分:0)

在这里添加更多好的回应 - 缓存缓存缓存缓存

请参阅  Disable browser cache for entire ASP.NET website