Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何调用和返回另一个控制器的输出';动作中的动作是什么?_C#_Asp.net_Asp.net Mvc_Asp.net Mvc 3 - Fatal编程技术网

C# 如何调用和返回另一个控制器的输出';动作中的动作是什么?

C# 如何调用和返回另一个控制器的输出';动作中的动作是什么?,c#,asp.net,asp.net-mvc,asp.net-mvc-3,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 3,我们正在为我们的项目开发一个“插件”架构,在这个架构中,为了扩展软件的功能,客户端可以编写自己的控制器,并将其包含在项目中。(插件将根据客户机将添加到模式中的表生成不同的输出) 插件是通过控制器动作中的动作访问的,比如说像/reports/get/?type=expensing 因此,在这种情况下,操作必须在“插件”区域内定位一个控制器,并调用索引操作(例如区域/plugin/spending/index)。如何在/reports/get/?type=expensing操作中调用此操作并获取其输

我们正在为我们的项目开发一个“插件”架构,在这个架构中,为了扩展软件的功能,客户端可以编写自己的控制器,并将其包含在项目中。(插件将根据客户机将添加到模式中的表生成不同的输出)

插件是通过控制器动作中的动作访问的,比如说像
/reports/get/?type=expensing


因此,在这种情况下,操作必须在“插件”区域内定位一个控制器,并调用索引操作(例如
区域/plugin/spending/index
)。如何在
/reports/get/?type=expensing
操作中调用此操作并获取其输出?

重定向操作可能是最好的选择-这样您就可以使用内置路由找到正确的操作-类似

return RedirectToAction("Index", "SpendingPlugin");
如果不需要重定向,可以按照Nathan的建议直接查找并调用控制器方法,但这往往会变得不必要的复杂并干扰视图的定位。

用于在视图中呈现其他操作的输出。从这一点出发,控制器中也会出现同样的情况

using System.Web.Mvc.Html;
public void Index()
        {
            StringBuilder resultContainer = new StringBuilder();
            StringWriter sw = new StringWriter(resultContainer);

            ViewContext viewContext = new ViewContext(ControllerContext, new WebFormView(ControllerContext, "fakePath"), ViewData, TempData, sw);

            HtmlHelper helper = new HtmlHelper(viewContext, new ViewPage());

            helper.RenderAction("create");

            sw.Flush();
            sw.Close();
            resultContainer.ToString(); //"This is output from Create action"
        }
public ActionResult Create()
        {
            return Content("This is output from Create action");
        }
事实上,RenderAction可以传递您想要的所有路由数据,不仅仅是动作名称。注意:这个解决方案可能看起来有点复杂,但它似乎是解决问题的唯一方法,正如发问者在他的问题中所描述的,更具体地说,他在问题的评论中指出,“它是关于创建被请求的控制器,并读取actionresult的输出。”(强调我的)

控制器和操作只是类和方法的花哨名称。为什么不像任何其他类那样实例化控制器,然后在控制器上调用索引操作呢?最困难的部分是实例化控制器,因为您要使用“插件”体系结构和所有关于控件的信息呃,它的名称是一个字符串。但是,任何一点反射都不能解决:

// GET: /reports/get/?type=spending

public Controller Reports
{
    public ActionResult Get(string typeName)
    {
        Type typeOfController;
        object instanceOfController;

        try
        {
            typeOfController = System.Reflection.Assembly.GetExecutingAssembly().GetType(name: typeName, throwOnError: true, ignoreCase: true)
            instanceOfController = System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(typeName: typeName, ignoreCase: true);
        }
        catch(Exception ex)
        {
            // Controller not found
            return View("InvalidTypeName");
        }

        ActionResult result = null;

        try
        {
            result = typeOfController.InvokeMember("Index", System.Reflection.BindingFlags.InvokeMethod, null, instanceOfController, null)as ActionResult;
        }
        catch(Exception ex)
        {
            // Perhaps there was no parametersless Index ActionMethod
            // TODO: Handle exception
        }

          return result;
    }
}

问题更多的是如何获取被请求的控制器,还是返回的结果?问题更多的是创建被请求的控制器,并从actionresult读取输出。您是否使用ioc容器?