.NET MVC DisplayModeProvider откат

Я сейчас пользуюсь DisplayModeProvider проверить, поступает ли мобильный запрос и обслуживает ли Page.mobile.cshtml файл, если я обнаруживаю мобильный запрос, в противном случае я обслуживаю страницу по умолчанию Page.cshtml, Это также работает как запасной вариант - если есть мобильный запрос на PageX, но PageX.mobile.cshtml не существует, но есть PageX.cshtml, Я подаю PageX.cshtml, Это работает как задумано.

Я хотел бы добавить к резервному поведению, поскольку я включаю поддержку запросов планшета. Поэтому, когда обнаружен запрос устройства планшета, если у меня есть Page.tablet.cshtml, он пойдет дальше и будет обслуживать этот файл. Если нет ...tablet.cshtml файл, я хотел бы попробовать Page.mobile.cshtml файл и если Page.mobile.cshtml не существует, мы бы служили Page.cshtml файл.

Есть ли способ сделать это без необходимости создавать ...tablet.csthml файл для каждой страницы и Html.Partialв ...mobile.cshtml внутри?

1 ответ

Вы можете сделать это, динамически изменяя настройки маршрута. Определите иерархию так, как вы хотите: сначала планшет, затем мобильный, а затем веб-страницы.

Вот пример того, как CustomViewEngine может сделать это:

public class MyViewEngine : RazorViewEngine
{
    public MyViewEngine()
        : base()
    {
        ViewLocationFormats = new[] {
        "~/Views/tab/{1}/%1/{0}.cshtml",
        "~/Views/mobile/{1}/%1/{0}.cshtml",
        "~/Views/{1}/%1/{0}.cshtml",
        "~/Views/Shared/{0}.cshtml"
    };

    PartialViewLocationFormats = new[] {
        "~/Views/tab/%1/{1}/{0}.cshtml",
        "~/Views/mobile/%1/{1}/{0}.cshtml",
        "~/Views/%1/{1}/{0}.cshtml",
        "~/Views/Shared/{0}.cshtml"
    };
   }
}

Здесь вид будет искать в /Views/tab/ папка сначала тогда /Views/mobile/ с последующим /Views/ и /Views/Shared/ папки.

Детали реализации обсуждались здесь: ASP.NET MVC Custom View Routing

Другие вопросы по тегам