扩展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()

扩展ASP.NET MVC操作方法.如何返回视图

为了作为一种行动暴露在宇宙中,一种方法必须满足某些要求:

  • 该方法必须是公共的
  • 该方法不能是静态方法
  • 该方法不能是扩展方法
  • 该方法不能是构造函数、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();
    }
}