C# 如何与其他控制器共享控制器操作/视图

C# 如何与其他控制器共享控制器操作/视图,c#,asp.net-mvc,C#,Asp.net Mvc,我想从几个不同的URL调用MainController.GetData()操作,而不需要复制/粘贴大量代码。人们有没有更喜欢的方法来解决这个问题?看来我也可以通过路由来完成。我只想重用视图和操作,因为如果我为GetMyData()操作创建一个版本,那么所有代码都是相同的 尽管控制器看起来像简单的类,但它们在MVC框架内的行为更为专业化。你不能,或者最好说你不应该,只是从一个动作中调用另一个动作,就好像这只是任何旧方法一样。大多数情况下,这是因为控制器有上下文,您必须实例化它们并正确设置它们,以便

我想从几个不同的URL调用MainController.GetData()操作,而不需要复制/粘贴大量代码。人们有没有更喜欢的方法来解决这个问题?看来我也可以通过路由来完成。我只想重用视图和操作,因为如果我为GetMyData()操作创建一个版本,那么所有代码都是相同的


尽管控制器看起来像简单的类,但它们在MVC框架内的行为更为专业化。你不能,或者最好说你不应该,只是从一个动作中调用另一个动作,就好像这只是任何旧方法一样。大多数情况下,这是因为控制器有上下文,您必须实例化它们并正确设置它们,以便一切正常。这在action方法中是非常重要的,它会让你的代码非常难看

你真的有两个选择。如果您只是想要操作的结果,最好的方法是利用
HttpClient
,并实际为其提交一个HTTP请求,就像任何其他将激活它的请求一样

然而,根据您对问题的描述,选项二可能更合适。您可以创建一个基类,然后从该基类继承。例如,如果您知道两个控制器都需要
GetData
,则可以执行以下操作:

public abstract class BaseController : Controller
{
    protected IEnumerable<Data> QueryData(int? userId = null)
    {
        ...
    }
}

public class MainController : BaseController
{
    public ActionResult GetData()
    {
        var data = QueryData();
        return View(data);
    }
}

public class OtherController : BaseController
{
    public ActionResult GetMyData()
    {
        var userId = GetCurrentUserId();
        var data = QueryData(userId);
        return View(data);
    }
}
公共抽象类BaseController:控制器
{
受保护的IEnumerable查询数据(int?userId=null)
{
...
}
}
公共类主控制器:BaseController
{
公共操作结果GetData()
{
var data=QueryData();
返回视图(数据);
}
}
公共类OtherController:BaseController
{
公共操作结果GetMyData()
{
var userId=GetCurrentUserId();
var数据=QueryData(userId);
返回视图(数据);
}
}
换句话说,您可以将公共功能分解为两个派生控制器上的操作都可以使用的功能


这是该场景所需的全部内容,但也可以在基本控制器上实现整个操作。例如,如果将
Foo
操作添加到
BaseController
,则
MainController
OtherController
都将响应
Foo
的请求,而无需实际明确定义。如果需要,您还可以覆盖这些操作。

我喜欢基本控制器的想法。我认为它将保持代码的整洁,并且我将能够重用操作代码和视图。除非有其他更干净的解决方案,否则我会接受这个。非常感谢。
public abstract class BaseController : Controller
{
    protected IEnumerable<Data> QueryData(int? userId = null)
    {
        ...
    }
}

public class MainController : BaseController
{
    public ActionResult GetData()
    {
        var data = QueryData();
        return View(data);
    }
}

public class OtherController : BaseController
{
    public ActionResult GetMyData()
    {
        var userId = GetCurrentUserId();
        var data = QueryData(userId);
        return View(data);
    }
}