Изменить представление в MVC

#c# #asp.net-mvc #model-view-controller #mobile #view

#c# #asp.net-mvc #модель-представление-контроллер #Мобильный #Вид

Вопрос:

Я новичок в MVC.

Мне нужно иметь два представления (для одной и той же логики), одно для обычного браузера и одно для мобильных устройств. Как я могу перенаправить на другое представление для мобильных устройств?

прямо сейчас у меня есть два контроллера, но я хочу использовать только один контроллер (HomeController.cs) для обоих представлений. Я знаю этот способ, у меня должны быть свои мобильные представления в разделе «Home». Пожалуйста, помогите мне перенаправить на мобильный просмотр, используя только один контроллер.

сейчас я использую приведенное ниже для перенаправления (с двумя контроллерами):

вернуть RedirectToAction(«Index», «Mobile»);

Я использую framework 3.5 и MVC 2

Комментарии:

1. просто в стороне я начал читать о приложениях в стиле Windows 8 «metro», и, похоже, они изначально нацелены на несколько целей пользовательского интерфейса

Ответ №1:

У меня возникли небольшие проблемы с представлением вашей настройки. Я предполагаю, что у вас есть текущая настройка:

Контроллеры
— HomeController.cs
— MobileController.cs
Число просмотров
— Home
—Index.aspx
— Mobile
—Index.aspx

Но вы хотите:
Контроллеры
— HomeController.cs
Число просмотров
— Home
—Index.aspx
— Mobile
—Index.aspx

Это правильно?

Обновить:

Как упоминали люди, упомянутые ниже, это одна из тех сделок, «именно так работает MVC». «Главная» — это место, куда вы можете перейти, но «Мобильная» — это определенный тип страницы. Если вы добавите еще одну область с именем «About» в качестве вложенной папки new Views, куда бы вы поместили свою мобильную папку? Что теперь должен обрабатывать mobile? Если мобильный не должен реплицировать обычный сайт, то у него должен быть свой собственный контроллер, даже если он реплицирует некоторый код (не забывайте, что вы можете создавать классы вне контроллеров, которые могут выполнять основную часть работы, которую может вызвать любой контроллер).

С другой стороны, если вам нужна мобильная версия каждой из ваших страниц, вы должны добавлять их в папку views для каждого маршрута. Например:

Контроллеры
— HomeController.cs
Число просмотров
— Home
— Mobile
— Index.aspx
—Index.aspx

Я не совсем уверен, где вы выполняете логику, чтобы выяснить, находятся ли они на мобильной платформе, но предполагая, что на данный момент это находится в контроллере где-то в вашем HomeController.cs, тогда у вас есть:

 public ActionResult Index() { 
if([check for mobile])
{
return View("Mobile/Index");
} else {
return View("Index"); 
}
 

Комментарии:

1. вы правильно поняли мою текущую настройку, это именно так. для новой настройки я могу использовать ее точно так, как вы предложили, или иметь мобильную папку в домашней папке. Я думаю, это не имеет никакого значения, пока у меня есть отдельные представления для Home и Mobile, но я использую только HomeController.cs. Я обнаруживаю браузер в Home>>Index ActionResult

2. открытый класс HomeController : контроллер { public ActionResult Index() { if (MobileHelper. IsMobileDevice(запрос. Агент пользователя)) { return RedirectToAction(«Index», «Mobile»); } return View(); } public ActionResult About() { return View(); } } выше приведен мой текущий код для перенаправления на мобильный контроллер. Теперь я хочу перенаправить на домашний контроллер, но использовать мобильный просмотр.

3. Это нарушает обычную структуру MVC. Большинство движков просмотра теперь будут считать, что Mobile — это имя контроллера. Это также скорее комментарий, чем ответ.

4. @Yuriy Основная причина моей попытки здесь — иметь только один контроллер (логический, скажем, логин) для обоих представлений. #boolean правильно настроил мои настройки, я просто не знаю, как мне следует кодировать в HomeController.cs, чтобы охватить как мобильный, так и обычный вид (Home) и как перенаправить на мобильный вид при обнаружении (для этого я использую свой собственный вспомогательный calss). Пожалуйста, будьте терпеливы со мной, поскольку я новичок в MVC.

5. @JohnHey у вас проблема, потому что контроллер не там, где это должно быть сделано. Код, который выбирает и отображает представление, происходит в другом месте. Это можно сделать в контроллере, но это было бы очень грязно и, вероятно, очень глючно. Логика, в которой выбирается правильный вид, находится в ViewEngine. Вы можете создать свой собственный или использовать один из примеров по ссылке, которую я предоставил. В частности, вам нужно будет взглянуть на методы FindView и FindPartialView . Это методы, которые принимают имя представления и контекст (которые вы можете использовать, чтобы проверить, находитесь ли вы на мобильном устройстве), и находят правильное представление.

Ответ №2:

Комментарии:

1. спасибо за ответ, но я не хочу использовать Razor и chtml, мне нравится использовать aspx-страницы.

2. @JohnHey на этой странице есть код для использования WebFormViewEngine, обратите внимание на строку 3 в примере.

3. @YuriyFaktorovich — это для mvc3, операция находится на mvc2

4. @DanielA. Белый Я бы сказал, что он должен начинаться с MVC 3, но, очевидно, могут быть причины для начала с 2. Несмотря на это, эта ссылка также содержит исходники для более старых версий.

Ответ №3:

Создать домашний контроллер для действия, подобного

Public ActionResult Index() {

}

И еще одно действие (мобильное)

Общедоступный ActionResult Mobile() {

}

Один контроллер имеет много действий (просмотр)

Контроллеры — HomeController.cs Views — Home —Index.chtml — Мобильный —Index.chtml