ASP.NET MVC3 - Как обслуживать View () с другого контроллера - PullRequest
4 голосов
/ 10 апреля 2011

Таким образом, чтобы выполнить то, что я просил в этой записи, я сделал следующее:

    [iPhone]
    [ActionName("Index")]
    public ActionResult IndexIPhone()
    {
        return new Test.Areas.Mobile.Controllers.HomeController().Index();
    }

    [ActionName("Index")]
    public ActionResult Index()
    {
        return View(); 
    }

, который все еще служит тем же представлением, что и метод действия Index в этом контроллере.Хотя я вижу, что он прекрасно выполняет метод действия Test.Areas.Mobile.Controllers.HomeController().Index().Что тут происходит?И как мне обслуживать представление Index из области Mobile без изменения URL-адреса запроса (как было указано в исходном сообщении, указанном выше)?

Ответы [ 3 ]

4 голосов
/ 10 апреля 2011

У вас есть несколько вариантов:

  1. Перенаправить на действие, которое вы хотите вернуть: return RedirectToAction("Action-I-Want").
  2. Вернуть представление по имени: return View("The-View-I-Want").

Обратите внимание, что при втором подходе вы должны поместить свое представление в папку «Shared», чтобы все контроллеры могли найти и вернуть его. Это может запутаться, если вы в конечном итоге разместите там все свои взгляды.

В качестве примечания: причина, по которой ваша работа не находит представление, заключается в том, что механизм представления по умолчанию ищет представление в папке, которая «принадлежит» текущему контексту исполняющего контроллера, независимо от того, какой код вы вызываете.

Edit:

Можно сгруппировать все "мобильные" представления в одну папку. На вашем Global.asax (или там, где вы настраиваете ViewEngine, просто добавьте путь к своему мобильному представлению в AreaViewLocationFormats. Имейте в виду, вам все равно придется называть свои представления по-другому.

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

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

1 голос
/ 10 апреля 2011

Самый простой способ отправить запрос представлению, обработанному другим контроллером, - RedirectToAction("View-Name", "Controller-Name").

Существуют перегрузки View(), которые принимают информацию о маршруте, которая также может работать, но для настройки потребуется больше усилий.

0 голосов
/ 04 ноября 2012

Что ж, на самом деле самый простой способ - это сделать одну версию вашего сайта запрограммированной по стандартам вместо определения браузера: D - однако, в прямом ответе, чтобы выполнить то же самое в ASP.NET MVC, используя: *

RedirectToAction("ViewName", "ControllerName"); 

- хороший метод, однако я обнаружил, что он более практичен, если вы чувствуете, что должны программировать для различных стандартов браузеров, чтобы создать основной вид и альтернативный «мобильный» вид под представлениями контроллеров. Затем вместо того, чтобы писать специальный код на каждом контроллере, вместо этого расширяйте контроллер следующим образом.

public class ControllerExtended : Controller 
{
    private bool IsMobile = false;
    private void DetectMobileDevices(){ .... }
}

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

public class ApplicationsController : ControllerExtended
{
    // GET: /Applications/Index
    public ActionResult Index() {
        this.DetectMobileDevices();
        if(this.IsMobile){
            return RedirectToAction("MobileIndex");
        } else {
            // actual action code goes here
            return View();
        }            
    }
}

В качестве альтернативы вы можете использовать return View ("ViewName"); но по моему опыту вы хотите на самом деле выполнять другие действия, а не просто показывать результат в другом представлении, как в случае представления таблицы HTML, а не таблицы Flex, чтобы помочь пользователям iPhone, поскольку в iPhone нет поддержки флэш-памяти и т. д. (на момент написания статьи)

...