.NET MVC 在不同的控制器上调用方法

19 浏览
0 Comments

.NET MVC 在不同的控制器上调用方法

有人可以告诉我如何在动作方法内部调用不同控制器上的方法吗?我不想进行重定向。我想在不同控制器上调用一个返回字符串的方法,并在我的动作方法中使用该响应。

0
0 Comments

问题的原因是在ASP.NET MVC中,直接从一个控制器调用另一个控制器的方法并不是一种常见的做法。在视图中可以使用HtmlHelper的Action方法实现这个目标,但在操作方法中获取HtmlHelper的实例并不直观。

解决方法是通过创建一个新的HtmlHelper实例来调用另一个控制器的方法。具体做法是创建一个ViewContext对象,并将当前控制器的ControllerContext作为参数传入。然后使用这个新的HtmlHelper实例来调用另一个控制器的方法。

在MVC 3中,可以使用以下代码实现:

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 2中,可能需要将ViewContext构造函数中的StringWriter参数移除。

另外,为了使用Action方法,还需要在代码中添加对System.Web.Mvc.Html命名空间的引用。

总之,通过创建新的HtmlHelper实例并传入当前控制器的ControllerContext,可以在一个控制器中调用另一个控制器的方法。

0
0 Comments

使用以下方法调用其他控制器上的方法:

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

这在ASP.NET MVC5中对我有效。希望对你也有效。

这个方法的问题是,没有上下文。所以如果你使用了"Server.MapPath(...."之类的方法,它将报错,因为Server为空。

问题出现的原因是在调用不同控制器上的方法时,没有上下文对象。解决方法是使用DependencyResolver来获取其他控制器的实例,并通过该实例调用方法。但是需要注意的是,由于没有上下文,某些依赖于上下文对象的方法可能会出错,如使用"Server.MapPath(...."方法时会报错,因为Server对象为空。

0
0 Comments

问题的原因是因为需要在不同的控制器上调用方法。解决方法是重构应用程序,将生成字符串的功能提取到一个新的独立类中,并让两个控制器使用该类。也可以考虑将字符串生成为HTML字符串,并将其传递给HTML到PDF生成器。另外一种解决方法是创建一个“SuperController”,让两个控制器都继承该控制器,并将共同的功能放在其中。

0