【问题标题】:Extend ASP.NET MVC action method. How to do return View?扩展 ASP.NET MVC 操作方法。如何做返回视图?
【发布时间】:2015-12-07 11:04:12
【问题描述】:

旧:

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()?

【问题讨论】:

  • 你到底想在这里做什么?我没有看到用例。
  • 扩展方法也不扩展方法,它们扩展类(即它们向类伪添加附加方法)。
  • @Jonesopolis 我只想在“Index()”方法中添加一个参数,“Index()”方法根据显示返回视图的“viewName”。但是不能修改原来的方法

标签: c# asp.net asp.net-mvc extension-methods


【解决方案1】:

为了作为一个动作暴露给宇宙,一个方法必须满足一定的要求:

  • 方法必须是公开的。
  • 该方法不能是静态方法。
  • 方法不能是扩展方法。
  • 方法不能是构造函数、getter 或 setter。
  • 该方法不能有开放的泛型类型。
  • 该方法不是控制器基类的方法。
  • 该方法不能包含 ref 或 out 参数。

所以该方法不能用作动作。

但如果它是一个不会成为操作的扩展方法,您可以使用您的hc 参数来访问Controller 的方法,例如View(),View(string),...

作为替代方案,您可以考虑在您的项目中添加一个基本控制器类,您的所有控制器都可以从它继承,并且在您的基本控制器类中,您可以添加您的自定义操作方法,覆盖控制器的某些方法等等。

【讨论】:

    【解决方案2】:

    你想做的事情并不常见。如果您写更多关于您确切想要的内容,我们可以提供更好的帮助。以下是您正在尝试做的事情。 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();
        }
    }
    

    【讨论】:

    • 谢谢。我想做如下: 1、添加新的view1.cshtml(一个新的主题) 2、不要修改原来的代码旧使用:@Html.Action("Index","HomeController");更新:@HtmlAction("Index","HomeController",{viewName="view1"})
    • 你有很多方法可以做到这一点。例如:您可以创建索引并将其写入@Html.Partial(partialViewName, this.Model) 其中partialViewName 是您的主题,它可以通过ViewBag.partialViewName 传递。除了这种形式,还有其他几种取决于情况,例如,您可以像这样使用 jquery:.. $ ("#MyDiv").empty().load('@Url.Action("ActionName" , "控制器" new {parameter = value}) '+' & nocache = '+ NewGuid);我现在没时间了,但我会用我这里的一些很好的例子写一个回复。
    猜你喜欢
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-11
    • 2019-07-20
    • 1970-01-01
    • 2016-03-22
    相关资源
    最近更新 更多