将公共代码放在视图控制器视图功能的哪里?

时间:2016-04-14 10:32:28

标签: c# .net asp.net-mvc

在其中一个控制器中,每个视图都有一个固定的预处理。有没有更好的方法来做到这一点,而不是下面的代码;这样 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();
}

3 个答案:

答案 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)

有两种方式:

  1. 使用具有不同视图的单个Action(如返回视图(“View1”)或retrun View(“View2”),您可以在其他条件下创建,以便在单个位置调用您的函数。

  2. 如果你想使用当前的程序(不推荐),那么你必须使用Action Filter属性并在Controller级别进行装饰,然后每个动作都会在执行你的Action之前执行你的逻辑

    < / LI>