ищет более чистый код при встраивании вызовов бритвы в текст - PullRequest
2 голосов
/ 31 мая 2011

Раньше у меня было что-то вроде этого:

We suggest you read our @Html.ActionLink("help page", "Help", "Home") before
proceeding.

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

We suggest you read our [HelpPage] before proceeding.

, а затем в представлении, которое я должен сделать:

@MvcHtmlString.Create(this.Resource("Help").ToString()
   .Replace("[HelpPage]",
       @Html.ActionLink("help page", "Help", "Home").ToString()
   )
)

Какие еще стратегии вы можете использовать для интернационализации с помощью Razor?

this.Resource() - это расширение страницы, которое вызывает .GetLocalResourceObject() и возвращает MvcHtmlString

Ответы [ 3 ]

0 голосов
/ 29 июня 2011

У меня была такая же проблема. Вместо использования заполнителей я использую такое же форматирование в строках ресурсов, как если бы я использовал String.Format(). Пример использования этого; строки моего ресурса

LogOnText1 | Please enter your user name and password. {0} if you don't have an account.
LogOnText1Register | Register

и мой взгляд (бритва):

@MvcHtmlString.Create(String.Format(ViewRes.AccountStrings.LogOnText1,
                      Html.ActionLink(ViewRes.AccountStrings.LogOnText1Register, "Register")))

Я думаю, что это немного чище

0 голосов
/ 02 июля 2011

вот что я написал в итоге:

public static class PageExtensions
{
    public static MvcHtmlString Resource(
        this WebViewPage page, string key, 
        Dictionary<string, MvcHtmlString> tokenMap
    ) {
        HttpContextBase http = page.ViewContext.HttpContext;
        string text = (string) http.GetLocalResourceObject(page.VirtualPath, key);
        return new TagReplacer(text, tokenMap).ToMvcHtmlString();
    }

, где замена тегов выполняется следующим образом:

public class TagReplacer
{
    Dictionary<string, MvcHtmlString> tokenmap;
    public string Value { get; set; } 

    public TagReplacer(string text, Dictionary<string, MvcHtmlString> tokenMap)
    {
        tokenmap = tokenMap;

        Regex re = new Regex(@"\[.*?\]", RegexOptions.IgnoreCase);
        Value = re.Replace(text, new MatchEvaluator(this.Replacer));
    }

    public string Replacer(Match m)
    {
        return tokenmap[m.Value.RemoveSet("[]")].ToString();
    }

    public MvcHtmlString ToMvcHtmlString()
    {
        return MvcHtmlString.Create(Value);
    }
}

, поэтому в моем коде я теперь могу назвать это так:

@{
   Dictionary<string, MvcHtmlString> tagmap = new Dictionary<string, MvcHtmlString>() {
                { "HelpPage", Html.ActionLink("help page", "Help", "Home") }
            };
}

и в других местах:

@this.Resource("Help", tagmap)

любые предложения по улучшению приветствуются

0 голосов
/ 31 мая 2011

Вы должны создать отдельный метод code-behind, который заменяет любые [placeholder] s фактическими ссылками, а затем вызвать этого помощника в представлениях Razor.

Это даст вам одно место для изменения кода, который заполняет ссылки.

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