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