我的基本控制器有:
[Authorize(Roles = "sys_admin")]
我希望在控制器中有一个不同的操作,可用于“user”和“sys_admin”。我可以覆盖,我该怎么做?
还有任何关于我可以在基本控制器中放置什么的建议,这可能使我的编码更简单。例如你的基本控制器中有什么?
答案 0 :(得分:3)
你在每个控制器中使用的任何东西 - 属性,方法,属性等。你将放在任何基类中的相同内容。
答案 1 :(得分:3)
为了补充讨论,我在共享控制器中有一些额外的实用工具方法。我写了一堆供企业使用的小应用程序,所以我尝试尽可能少地重复代码。
这就是我到目前为止所得到的。
答案 2 :(得分:2)
在我的基本控制器中,我实际上放了一些实用工具方法([NonAction]
)。如果可能的话,我更喜欢通过使用Attributes进行装饰来向控制器添加功能。
最近我的基本控制器有:
protected override void OnException(ExceptionContext
filterContext);
覆盖,至少记录未处理的异常并具有
某种自动通知[Authorize]
,[HandleError]
,[OutputCache]
)。随着时间的推移,你会发现越来越多的实用程序与你的控制器保持一致,尝试用更简单的程序保存程序集(避免重度依赖),对你的下一个MVC项目来说会很方便。 (助手也是如此,在某种程度上也适用于EditorTemplates)。
对于授权属性部分,我认为最干净的方法是编写自己的AuthorizeAttribute
类,特别是NonAuthorizeAttribute
。我想我也在SO上看过它。
您还可以使用默认Order
的{{1}}属性 - 在BaseController和Action中放置不同的Order,以便首先执行Action,但我不记得你是否真的可以打破属性处理链。
此致
微米。
答案 3 :(得分:1)
我们无法告诉你基本控制器中你需要什么,你必须在实现你的控制器时看到这些东西并看到重复代码..不要犹豫将这些东西重构到你的BaseController,并记住,那个也许你应该有2个或更多BaseControllers,或BaseControllers的2层层次结构。
我给你两个提示,我在BaseController中总是有的:
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)
在这里添加更多好的回应 - 缓存缓存缓存缓存