不同控制器上的.NET MVC调用方法(.NET MVC Call method on differ

2019-06-18 13:53发布

谁能告诉我如何调用不同的控制器上的方法,从操作方法中? 我不想重定向。 我想打电话给不同的控制器返回一个字符串,用我的行动方法中的响应上的方法。

Answer 1:

声音在我耳边像你应该重构你的应用程序,并提取生成串出一个新的独立的类功能(或重用现有的类,如果你有一个适合),并让两个控制器使用类。



Answer 2:

您可以使用下面的方法来调用一个方法的其他控制器上:

var otherController = DependencyResolver.Current.GetService<OtherController>();
var result = otherController.SomeMethod();

这在ASP.NET MVC5为我工作。 希望它会为你工作为好。



Answer 3:

你可以只实例化控制器的操作方法,并打电话给你所需要的其他方法?

public ActionResult YourActionMethod()
{
   SomeController c = new SomeController();
   ActionResult result = c.SomeMethod();

   return View();
}


Answer 4:

您可以通过实现此Action的方法HtmlHelper

在视图中,你会做这样的:

@Html.Action("OtherAction")

但是它不是直接获得的实例HtmlHelper中的操作方法(设计)。 事实上,它是这样一个可怕的黑客,我不愿意,甚至张贴...

var htmlHelper = new HtmlHelper(new ViewContext(
                                      ControllerContext, 
                                      new WebFormView(ControllerContext, "HACK"),
                                      new ViewDataDictionary(),
                                      new TempDataDictionary(),
                                      new StringWriter()),
                                new ViewPage());

var otherViewHtml = htmlHelper.Action("ActionName", "ControllerName");

这适用于MVC 3,您可能需要删除StringWriter从ARG ViewContext构造函数MVC 2,IIRC。

</劈>



Answer 5:

我没有使用过温莎城堡的IoC,但理论是,你应该能够创建一个自定义控制器工厂类,然后指示MVC框架使用这个定制的控制器工厂,由Global.asax.css文件对其进行注册在Application_Start事件:

protected void Application_Start()
{
   RegisterRoutes(RouteTable.Routes);
   ControllerBuilder.Current.SetControllerFactory(new MyCustomControllerFactor());
}

[见临Asp.Net MVC 2框架,史蒂芬Sanderson的Apress出版,第64 - 66]

这样的话,你可以在你的代码的任何地方实例化控制器。

不从“当前”控制器,或从其它代码调用另一个控制器的动作的概念是完全错误的。 控制器只是类。 由MVC框架一种特殊的方式调用时,他们只能成为“控制器”。

因此,对与错的这个归结为你为什么这样做,而不是你是否应该或不。

如果你只是使用控制器为一类,那么这是罚款。 如果你要使用这个发送给用户的响应,那么你应该使用一个RedirectToAction如上建议。

有许多理由来使用控制器为一类,而不是作为一个控制器。 例如,在测试你的控制器时。 因此,从作为一类治疗你的控制器是必要的,而不是错误的。

使用控制器作为一类的非测试场景例如:

我写的是利用了MVC框架的模板功能来产生HTML邮件的HTML,所有的Web应用程序需要做的,由于某种原因或其他(如订单确认邮件)什么迷你框架。

大致来说,你实例化MailManagerController(为简单起见,假设你没有使用IOC)在NormalController的行动(即需要发送电子邮件),然后执行:

MailManagerController mailmanager = new MailManagerController();
string html = mailmanager.OrderConfirmation(order).RenderToString();
Postman.SendEmail(html, order.UserEmailAddress, "MyApp order confirmation");

其中RenderToString是呈现一个动作的输出(即返回ViewResultBase对象)到一个字符串上ViewResultBase扩展方法,以及邮差是一个静态类与发送电子邮件,一旦你有文字的交易。

这种技术的好处是,你可以使用MVC框架来产生模板的电子邮件,因为OrderConfirmation的行动将有一个相关的观点是什么,如果不是你的电子邮件中的HTML模板你要送。



Answer 6:

貌似你试图做一些事情的控制器不适合。 设计您所需的方法在某些类的公共方法,并从两个控制器操作调用。



Answer 7:

我一直在寻找同样的事情,但严重的人,为什么需要写这样复杂的答案。

这里有一个帖子说会回答很简单地: 使用Html.ActionLink调用不同的控制器上行动

基本上你只需要使用ActionLink的这个过载: ActionLink(HtmlHelper, String, String, String, Object, Object)

所以,你将有: ActionLink("linkText", "actionName", "controllerName", routeValues, htmlAttributes)

如果你没有任何routeValues(这是操作的输入)或htmlAttributes,你必须将它们设置为NULL。

下面是一个例子电话: @Html.ActionLink("Add New Student", "Create", "Student", null, new { @class = "btn btn-primary" })



文章来源: .NET MVC Call method on different controller