2011-07-22 13 views
6

Pracuję nad nowym projektem przy użyciu ASP.NET MVC 3 w/Razor i rozwijam 2 różne widoki tej samej witryny, pełnej wersji i wersji mobilnej. Jakie są najlepsze praktyki/podejścia do korzystania z tych samych kontrolerów, ale wyświetlanie różnych widoków w oparciu o klienta użytkownika? Czy powinienem sobie z tym poradzić w kontrolerach? Wydaje się, że byłoby to uciążliwe, redundantne, podatne na błędy, gdyby instrukcje w każdej akcji kontrolera sprawdzały agenta użytkownika, a następnie zwracały inny widok w zależności od urządzenia.ASP.NET MVC osobne widoki mobilne za pomocą tych samych kontrolerów

+2

Przypuszczam, że to warto wspomnieć, to jest * planowane * w przypadku MVC 4 http://aspnet.codeplex.com/wikipage?title=ASP.NET%20MVC%204%20RoadMap –

+0

Proszę oznaczyć jako poprawny numer –

Odpowiedz

7

ten można teraz przeprowadzić stosując wbudowany cechą ASP.NET MVC (od wersji 4 roku) o nazwie „DisplayModes

Domyślnie ASP.NET MVC jest dostarczany z dwoma trybami wyświetlania zabudowy. Istnieje domyślny tryb wyświetlania, który renderuje "standardowe" widoki, tak jak zawsze, i istnieje również ogólny tryb wyświetlania "mobilny".

To działa, wykrywając, czy urządzenie klienta jest przeglądarką mobilną, czy nie (co samo jest określane przez wykrywanie User-Agent string urządzenia klienta, więc nie jest w 100% niezawodne). Jeśli urządzenie zostanie określone jako urządzenie mobilne, rzeczywisty widok MVC, który jest wysyłany do klienta, zostanie zastąpiony, a alternatywny widok zostanie zrenderowany i wysłany. W przypadku dołączonego trybie wyświetlacza telefonu, jest skonfigurowany tak, aby spojrzeć na widok z przyrostkiem .mobile.cshtml zamiast .cshtml (jak pokazano na poniższym zrzucie ekranu)

Image of solution explorer showing mobile view file

Pozwala to na zaprojektowanie całkowicie różne poglądy który zostanie wysłany na urządzenie mobilne a urządzenie inne niż mobilne, bez konieczności wprowadzania zmian w logice sterownika, więc nie musisz uwzględniać tam żadnej logiki warunkowej.

Jeśli potrzebujesz większej szczegółowości kontroli nad widokiem, który został wysłany do urządzenia klienta, cała funkcjonalność trybów wyświetlania jest konfigurowalna i rozszerzalna. Możesz zdefiniować własne tryby wyświetlania (zwykle wykonywane w Uruchamianiu aplikacji), które mogą być specyficzne dla danej przeglądarki, danego urządzenia lub dowolnej dowolnej definicji. Wszystkie są oparte na ciągu agenta użytkownika pochodzącym z urządzenia klienta.

Rozważmy następujący fragment kodu poniżej, który pokazuje dodanie 3 dodatkowe tryby niestandardowy wyświetlania dla Windows Phone, iPhone i Android w sposobie uruchamiania aplikacji:

protected void Application_Start() 
{ 
    DisplayModeProvider.Instance.Modes.Insert(0, new DefaultDisplayMode("WP") 
    { 
     ContextCondition = (context => context.GetOverriddenUserAgent(). 
      IndexOf("Windows Phone OS",StringComparison.OrdinalIgnoreCase) >= 0) 
    }); 

    DisplayModeProvider.Instance.Modes.Insert(1, new DefaultDisplayMode("iPhone") 
    { 
     ContextCondition = (context => context.GetOverriddenUserAgent(). 
      IndexOf("iPhone", StringComparison.OrdinalIgnoreCase) >= 0) 
    }); 

    DisplayModeProvider.Instance.Modes.Insert(2, new DefaultDisplayMode("Android") 
    { 
     ContextCondition = (context => context.GetOverriddenUserAgent(). 
      IndexOf("Android", StringComparison.OrdinalIgnoreCase) >= 0) 
    }); 
} 

Każdy tryb wyświetlania jest podany identyfikator i ciąg dopasuj ciąg znaków agenta użytkownika, aby określić, czy ten tryb wyświetlania ma być używany. Jeśli tak, to DisplayModeProvider będzie szukał widoku z tym samym sufiksem ciągu znaków. (Dla powyższego trybu wyświetlania iPhone'a spodziewamy się znaleźć ciąg "iPhone" w dowolnym miejscu ciągu agenta użytkownika, a jeśli istnieje, używamy tego trybu wyświetlania, który renderuje widoki z przyrostkiem iphone.cshtml, zamiast z przyrostkiem .

Możesz przeczytać więcej o tej funkcji, tutaj. http://www.asp.net/mvc/overview/older-versions/aspnet-mvc-4-mobile-features konkretnie w sekcjach zatytułowanych „nadrzędne Widoki, Układy i częściowym widokiem” i „Przeglądarka specyficzne Views”

+0

Dziękujemy za grea t odpowiedz! W oparciu o twoją odpowiedź chciałbym zbudować ścieżkę do różnych obrazów w kodzie za sobą, a nie w widoku "Widok". Czy w jakiś sposób można to zrobić w kontrolerze? –

Powiązane problemy