.NET MVC 在不同的控制器上调用方法
问题的原因是在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,可以在一个控制器中调用另一个控制器的方法。
使用以下方法调用其他控制器上的方法:
var otherController = DependencyResolver.Current.GetService<OtherController>(); var result = otherController.SomeMethod();
这在ASP.NET MVC5中对我有效。希望对你也有效。
这个方法的问题是,没有上下文。所以如果你使用了"Server.MapPath(...."之类的方法,它将报错,因为Server为空。
问题出现的原因是在调用不同控制器上的方法时,没有上下文对象。解决方法是使用DependencyResolver来获取其他控制器的实例,并通过该实例调用方法。但是需要注意的是,由于没有上下文,某些依赖于上下文对象的方法可能会出错,如使用"Server.MapPath(...."方法时会报错,因为Server对象为空。