在文本中嵌入剃须刀调用时寻找更干净的代码

时间:2011-05-30 23:22:23

标签: asp.net-mvc-3 internationalization razor

我曾经有这样的事情:

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 :(得分:0)

您应该创建一个单独的代码隐藏方法,用实际链接替换任何[placeholder],然后在Razor视图中调用该帮助程序。

这将为您提供一个单独的位置来更改填充链接的代码。

答案 1 :(得分:0)

我遇到了同样的问题。我没有使用占位符,而是在资源字符串中使用相同的格式,就像我使用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")))

我觉得它有点清洁

答案 2 :(得分:0)

所以这就是我最后写的内容:

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)

任何改进建议最受欢迎