扩展ASP.NET MVC操作方法.如何返回视图
本文关键字:返回 视图 何返回 ASP NET MVC 操作方法 扩展 | 更新日期: 2023-09-27 18:12:09
旧版:
public class HomeController : Controller {
public ActionResult Index()
{
// do something
return View();
}
}
我想扩展Index()
:
public static class HomeControllerExtensions{
public static ActionResult Index(this HomeController hc,string viewName)
{
// do something
return View(viewName);//hc.View cannot...., how to do return View()?
}}
如何返回View()
?
为了作为一种行动暴露在宇宙中,一种方法必须满足某些要求:
- 该方法必须是公共的
- 该方法不能是静态方法
- 该方法不能是扩展方法
- 该方法不能是构造函数、getter或setter
- 该方法不能具有打开的泛型类型
- 该方法不是控制器基类的方法
- 该方法不能包含ref或out参数
因此,该方法不能用作动作。
但是,如果它是一个扩展方法而不是操作,则可以使用hc
参数访问Controller
的方法,如View()
、View(string)
。。。
作为替代方案,您可以考虑向项目中添加一个基本控制器类,所有控制器都可以从中继承,并且在基本控制器类中,您可以添加自定义操作方法、覆盖控制器的某些方法等等。
您想要做的事情并不常见。如果你写更多你想要的东西,我们可以提供更好的帮助。下面是您尝试执行的操作。视图由System.Web.Mvc.Html.Action调用。也就是说,如果下面的代码对某些内容有用,则只能在控制器中使用。在这个例子中,我在SomeController中使用您想要创建的扩展名调用操作"About"控制器"Home"。
扩展代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Html;
using System.Web.Routing;
namespace StackOverflow.Controllers
{
public static class ControllersExtensions
{
public static ActionResult Index(this HomeController controller, string ViewName)
{
string controllerName = controller.GetType().Name.Replace("Controller", "");
RouteValueDictionary route = new RouteValueDictionary(new
{
action = ViewName,
controller = controllerName
});
RedirectToRouteResult ret = new RedirectToRouteResult(route);
return ret;
}
}
}
SomeController:
namespace StackOverflow.Controllers
{
public class SomeController : Controller
{
//
// GET: /Some/
public ActionResult Index()
{
HomeController home = new HomeController();
return home.Index("About");
}
}
}
家庭控制器:
public class HomeController : Controller
{
public ActionResult Index()
{
ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application.";
return View();
}
public ActionResult About()
{
ViewBag.Message = "Your app description page.";
return View();
}
public ActionResult Contact()
{
ViewBag.Message = "Your contact page.";
return View();
}
}