2015-09-11 3 views
0

старый:расширять ASP.NET MVC метод действия, как сделать return View?

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

+3

, что вы на самом деле пытаетесь сделать здесь? Я не вижу случай использования. – Jonesopolis

+0

Методы расширения также не расширяют методы, они расширяют классы (то есть они псевдо добавляют дополнительные методы к классу). –

+0

@Jonesopolis Я просто хочу добавить параметр к методу «Index()», «Index()» в соответствии с отображением «viewName» в представлении возврата. Но не можете изменить оригинальный метод – Tomcat

ответ

1

Что вы хотите сделать, не является обычным явлением. Если вы больше пишете о том, чего хотите, мы можем помочь лучше. Ниже вы пытаетесь сделать это. Вид вызывается System.Web.Mvc.Html.Action. То есть, если код ниже полезен для чего-то, его можно использовать только в контроллере. В примере я нахожусь в SomeController, вызывая действие «О» на контроллере «Главная», используя расширение, которое вы хотите создать.

Кодекс Расширение:

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(); 
    } 
} 
+0

Большое спасибо! – Tomcat

+1

Спасибо. Я хочу сделать следующее: 1, добавить новый view1.cshtml (Новая тема) 2, Не изменяйте оригинальный код старый, используя: '@Html.Action («Index», «HomeController»); ' обновлено: ' @HtmlAction («Index», «HomeController», {viewName = "view1"}) ' – Tomcat

+3

У вас есть много способов сделать это. Например: вы можете создать свой индекс и написать ему @ Html.Partial (partialViewName, this.Model), где partialViewName - это ваши темы, и его можно передать через ViewBag.partialViewName. В дополнение к этой форме есть несколько других, которые зависят от ситуации, например, вы можете использовать jquery следующим образом: .. $ ("#MyDiv"). Empty(). Load ('@ Url.Action ("ActionName "," Controller "new {параметр = значение}) '+' & nocache = '+ NewGuid); У меня сейчас нет времени, но я бы написал ответ с хорошими примерами, которые у меня есть. –

4

Для того, чтобы подвергаться воздействию Вселенной как действие, метод должен соответствовать определенным требованиям:

  • Метод должен быть публичным.
  • Метод не может быть статическим методом.
  • Метод не может быть методом расширения.
  • Метод не может быть конструктором, геттером или сеттер.
  • Метод не может иметь открытые общие типы.
  • Метод не является методом базового класса контроллера.
  • Метод не может содержать параметры ref или out.

Таким образом, метод не может использоваться как действие.

Но если это метод anextension, что не будет действием, вы можете использовать параметр hc для доступа к методам Controller как View(), View(string), ...

В качестве альтернативы вы можете рассмотреть вопрос о добавлении базы класс контроллера для вашего проекта, который все ваши контроллеры могут наследовать от него, а в вашем классе базового контроллера вы можете добавить свои собственные методы действий, переопределить некоторые методы контроллера и так далее.