Держите мой взгляд как можно более чистым (для ясности) - PullRequest
1 голос
/ 29 марта 2012

На мой взгляд (asp.net mvc razor) я хотел бы отобразить описание (из моей модели) на французском или голландском на основе текущей культуры потоков. Ниже моя фактическая реализация.

            <td>@item.Title</td>
            <td>@item.SubTitle</td>

            @if (Thread.CurrentThread.CurrentCulture.Name == "fr-BE") { 
                <td>@item.MaterialPacking.DescriptionFr</td>
            } else { 
                <td>@item.MaterialPacking.DescriptionNl</td> 
            }

            <td>@item.Quantity</td>
            ...

Я думаю, что ясность кода не оптимальна, но я не думаю, что создание специального помощника для этого необходимо. Есть ли другие возможности?

Спасибо.


UPDATE

Вот фрагмент данных, которые я извлекаю из своего хранилища.

enter image description here

Как видите, у меня есть 2 варианта: ... fr или ... nl

Мне нужен конкретный предмет, основанный на текущей культуре.

вот линк:

var request = requestRepository.Find(x => x.RequestID == requestID)
                .MyInclude(x => x.TransportedMaterials.Select(y => y.MaterialPacking)).FirstOrDefault();

return request.TransportedMaterials;

Ответы [ 5 ]

1 голос
/ 29 марта 2012

Вам не нужен специальный регистр (он не будет масштабироваться: если бы вы добавили еще один язык, вам бы пришлось добавить новый блок else везде, где вы это делаете). Чтобы получить локализованные строки, используйте встроенный менеджер ресурсов. Visual Studio делает это очень просто ... Ищите (или ищите локализацию) в MSDN.

Таким образом, ваш код станет:

        <td>@item.Title</td>
        <td>@item.SubTitle</td>

        <td>@Resources.MaterialPackingDescription</td>

        <td>@item.Quantity</td>
        ...

Обратите внимание, что вы также используете неправильное свойство: для ресурсов вы должны использовать Thread.CurrentThread.CurrentUICulture вместо CurrentCulture.

1 голос
/ 29 марта 2012

Если вы используете пользовательскую ViewModel, вы можете взять на себя ответственность контроллера за заполнение свойства MaterialPacking сообщением на правильном языке. Это перемещает код из поля зрения.

Тем не менее, утверждение if/else все еще является плохой практикой. Что произойдет, если вы решите поддержать испанский? Вы хотите изменить каждое из этих if утверждений в коде? Вам следует создать сервис, в котором вы можете передать ему ключ для сообщения, и он вернет вам реальное сообщение на текущем языке.

Таким образом, код вашего контроллера в конечном итоге скажет что-то вроде этого:

item.MaterialPackingDescription = 
    _languageService.GetDescription(item.MaterialPacking);

И ваш код просмотра:

<td>@item.MaterialPackingDescription</td>
0 голосов
/ 29 марта 2012

Вы должны сохранить свои строковые значения в App_GlobalResources, а затем использовать их оттуда.

Проверьте эту статью для получения дополнительной помощи

0 голосов
/ 29 марта 2012

Взгляните на этот блог о локализации .

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

0 голосов
/ 29 марта 2012

Почему бы не выполнить эту логику в вашем контроллере или модели представления.Тогда вам не нужно будет делать это по вашему мнению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...