Концепция перевода и шаблонов веб-страниц ASP.NET

Я только начал играть с WebPages (Razor) и понял некоторые основные концепции за стеной. Прежде всего, я перечисляю то, что мне всегда нужно для каждого сайта, который я создаю:

  • Дружественные URL-адреса, конечно (веб-страницы делают это за меня)
  • Переведенные URL-адреса (веб-страницы поддерживают параметры, поэтому ими легко управлять)
  • Поддержка нескольких шаблонов (веб-страницы не поддерживаются по умолчанию, здесь требуется некоторая логика)
  • Отдельный код для каждой функции, чтобы избежать дублирования (WebPages поддерживает его за стеной)

Итак, если вы думаете о приведенном выше списке, в игру вступает старый добрый шаблон MVC. В ASP.NET уже есть инфраструктура MVC(3), которая предоставляет все необходимые мне функции. Я это хорошо знаю. В этом вопросе я пытаюсь выяснить, будет ли технология WebPages также идеальной платформой для разработки крупномасштабных MVC-подобных веб-проектов.

Я проверил поведение загрузки страницы/цепочку веб-страниц и выяснил, что это действительно цепочка, построенная из загруженной страницы и одного или нескольких вложенных макетов. Каждая страница макета имеет указатель на свою загрузочную (родительскую) страницу.

На этом этапе мне нужно прояснить некоторые основные понятия. Поскольку веб-страницы разрешают URL-адреса по физическим файлам и папкам (путям), переведенные URL-адреса косвенно поддерживаются, потому что я могу создавать переведенные папки и файлы, используя такие пути: ..../en/account/register, и я могу создать другой путь, например, венгерский язык путь: .../hu/szemelyes/regisztracio.

Все, что мне нужно, это разделить код, потому что не так элегантно записывать логику регистрации в оба файла .cshtml. WebPages поддерживает @helpers и @functions, поэтому легко создать «Account.cshtml» и создать все необходимые мне функции. Это официальный ответ на мой вопрос.

Что произойдет за стеной, если я напишу @function в каком-нибудь .cshtml (вспомогательном) файле? Он создает для меня новый класс, который наследует WebPageHelper. Я думаю, что это не слишком элегантный способ, поскольку я могу создать свой собственный класс для обеспечения той же функциональности.

В ходе дальнейших исследований я обнаружил, что каждая страница (и страница макета) по умолчанию наследует класс WebPage. С помощью директивы @inherits я могу переопределить наследование по умолчанию и идеальный способ создать свой собственный класс, производный от WebPage, и во всем моем файле .cshtml я могу напрямую наследовать от этой страницы.

На данный момент я могу разделить код (я думаю:) более элегантным способом, чем использование @functions. А как насчет текстовых переводов? Я думаю, что это общий способ использования файлов ресурсов, но с веб-страницами я думаю хранить текстовые значения в простых файлах .cshtml. Что вы думаете об этом?

Наконец, мой register.cshtml:

@inherits Account.Register
@{
     Title = "Please Register"
}

..и мой файл regisztracio.cshtml:

@inherits Account.Register
@{
    Title = "Kérem regisztráljon"
}

Мой класс Account.Register имеет свойство String Title:

public class Register : WebPage
{
    public String Title { get; set; }
    ...
}

Есть еще одна вещь, которую я должен сказать. Мой файл register.cshtml (как и файл regisztracio.cshtml) не содержит HTML-разметки. У меня есть файл макета по умолчанию (_Master.cshtml), и у меня есть другие файлы макета для каждой страницы (_Register.cshtml) в моем каталоге «Просмотр». Мой код автоматически загружает правильный файл макета страницы по имени моего загруженного класса «контроллер». Таким образом, мой класс Register автоматически загружает файл макета «_Register.cshtml». И все файлы макетов страниц автоматически загружают _Master.cshtml (или _Mobile.cshtml, если посетитель использует мобильное устройство), который является основным макетом.

Итак, я думаю, что это шаблон MVC, реализованный для технологии WebPages, при этом сохраняя сильные функциональные возможности WebPages, такие как автоматическое разрешение URL-адресов.

Что вы думаете?

Так что это моя основная концепция с веб-страницами


person ggabor    schedule 21.05.2012    source источник


Ответы (1)


Я уверен, что по мере знакомства с фреймворком вы будете использовать и другие практики. Что касается языкового перевода, вы можете использовать настройки культуры вместе с файлами ресурсов. Вы можете установить текущие настройки культуры через global.asax на основе параметра запроса.

Пример инициализации настроек культуры:

CultureInfo ci = new CultureInfo("en-US");
Thread.CurrentThread.CurrentCulture = ci;
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(ci.Name);

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

@inherits Account.Register
@{
    Title = StringsResource.RegisterTitle
}

В зависимости от настройки культуры переменная Title будет содержать либо текст «Пожалуйста, зарегистрируйтесь», либо «Kérem regisztráljon».

Удачи!

person Igorrious    schedule 22.05.2012
comment
Да, если бы я использовал традиционные файлы ресурсов, мне не нужны два или более языковых файла страницы для переводов. Но мне все еще нужны эти два или более файла страниц для перевода URL-адресов. Если я сохраняю только один файл страницы и использую файлы культуры и ресурсов, как я могу переводить URL-адреса? WebPages уже имеет базовую маршрутизацию URL-адресов, поэтому я думаю, что было бы легко построить на ней мою концепцию для переводов URL-адресов. Тогда мне все еще нужны отдельные файлы страниц для каждого языка. Тогда эти файлы подходят для хранения текстов на конкретном языке. - person ggabor; 23.05.2012
comment
Вы можете создавать маршруты, которые будут перенаправлять пользователей в одно и то же представление, но с разными URL-адресами. Глядя на ваш код, у вас есть контроллер под названием account и просмотр под названием register. Маршрут по умолчанию может быть таким же. Чтобы получить доступ к маршруту на венгерском языке, у вас будет что-то вроде этого: routes.MapRoute("RegisterAccountHungarian", "szemelyes/regisztracio/{id}", new { controller = "account", action = "register", id = UrlParameter.Optional } ); Вам нужно будет добавить языковой параметр. - person Igorrious; 23.05.2012
comment
И если бы я это сделал, мне пришлось бы создавать MapRoute для каждой переведенной папки и файла. С WebPages это уже сделано механизмом маршрутизации по умолчанию на основе путей. Я знаю, как работает MVC3. Здесь я пытаюсь создать новую концепцию специально для фреймворка WebPages. Поэтому я не хочу использовать функцию MapRoute. Я пытаюсь построить свое решение на основе простых путей к файлам — папкам и файлам. Я ищу лучший, идеальный подход к этой технологии веб-страниц. Не для фреймворка MVC3. - person ggabor; 24.05.2012