在其中一个控制器中,每个视图都有一个固定的预处理。有没有更好的方法来做到这一点,而不是下面的代码;这样 SomeFunctionAsync 在返回View()之前没有在该控制器中使用返回View()的所有函数之前写入该行?我也有一些ajax帖子功能。
public async Task<ActionResult> View1()
{
await SomeFunctionAsync();
return View();
}
public async Task<ActionResult> View2()
{
await SomeFunctionAsync();
return View();
}
换句话说,最后我希望能够写出具有相同效果的以下内容
public async Task<ActionResult> View1()
{
return View();
}
public async Task<ActionResult> View2()
{
return View();
}
答案 0 :(得分:2)
如果Varun建议的Action Filter不适合您,您可以尝试其他方式。
创建所有视图的父视图。在父视图的操作方法中。调用此方法SomeFunctionAsync()。因此,将为您的所有视图调用父视图,并且将执行所需的方法
答案 1 :(得分:0)
您可以为控制器创建基类,并让代码中的每个视图调用一个通用方法。我使用GetView
作为方法名称(或者您可以覆盖现有名称)。
像这样:
public class MyControllerBase : Controller {
public Task<ActionResult> GetView() {
yourCommonMethod();
return View();
}
public Task<ActionResult> GetView(string viewName) {
yourCommonMethod();
return View(viewName);
}
public Task<ActionResult> GetView(object model) {
yourCommonMethod();
return View(model);
}
public Task<ActionResult> GetView(string viewName, object model) {
yourCommonMethod();
return View(viewName, model);
}
}
然后在你的控制器中继承:
public class MyController : MyControllerBase {
public async Task<ActionResult> View1()
{
return GetView();
}
}
如果所有控制器的通用方法相同,并且没有特定于控制器的依赖关系,那么就可以这么简单。但是,您可能也希望使用泛型:
public class MyControllerBase<T> : Controller {
// base class stuff here based on type T's interface
}
public class MyController : MyControllerBase<MyController> {
// regular class here, sending MyController to the base
}
这些是OOP的基本构建块。你可能会得到一本涵盖OOP基础知识并通过这类工作的书。
答案 2 :(得分:0)
有两种方式:
使用具有不同视图的单个Action(如返回视图(“View1”)或retrun View(“View2”),您可以在其他条件下创建,以便在单个位置调用您的函数。
如果你想使用当前的程序(不推荐),那么你必须使用Action Filter属性并在Controller级别进行装饰,然后每个动作都会在执行你的Action之前执行你的逻辑
< / LI> 醇>