Asp.net mvc 3 在文本中嵌入razor调用时寻找更干净的代码
我曾经有过这样的东西:Asp.net mvc 3 在文本中嵌入razor调用时寻找更干净的代码,asp.net-mvc-3,internationalization,razor,Asp.net Mvc 3,Internationalization,Razor,我曾经有过这样的东西: We suggest you read our @Html.ActionLink("help page", "Help", "Home") before proceeding. public class TagReplacer { Dictionary<string, MvcHtmlString> tokenmap; public string Value { get; set; } public TagReplacer(stri
We suggest you read our @Html.ActionLink("help page", "Help", "Home") before
proceeding.
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") }
};
}
又好又干净。然后我决定我们需要将应用程序国际化。我想不出比在资源文件中存储以下字符串更好的方法来处理上述问题:
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
您应该创建一个单独的代码隐藏方法,用实际链接替换任何[占位符]
,然后在Razor视图中调用该帮助程序
这将为您提供一个位置来更改填充链接的代码。您应该创建一个单独的代码隐藏方法,用实际链接替换任何
[placeholder]
s,然后在Razor视图中调用该帮助器
这将为您提供一个位置来更改填充链接的代码。我也遇到了同样的问题。我没有使用占位符,而是在资源字符串中使用与使用
String.Format()
相同的格式。
一个使用这个的例子;我的资源字符串
LogOnText1 | Please enter your user name and password. {0} if you don't have an account.
LogOnText1Register | Register
我的观点是:
我觉得有点干净我也有同样的问题。我没有使用占位符,而是在资源字符串中使用与使用
String.Format()
相同的格式。
一个使用这个的例子;我的资源字符串
LogOnText1 | Please enter your user name and password. {0} if you don't have an account.
LogOnText1Register | Register
我的观点是:
我觉得它更干净了一点所以我最后写的是:
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 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();
}
任何改进建议都很受欢迎听起来很合理,但我不能完全考虑清楚。。。所以我会有
@Html.MyFn(“帮助”、@Html.ActionLink())
?这真的很像模板制作。。。以上是一个很好的“标签”更换,但如果我有2它变得复杂。。。想法?@ekkis:你应该在函数中替换标记。是的,但问题是没有好的方法来实现通用性。。。除非我要传递一个字典,其中术语是要替换的标记,定义是要运行的某段代码,例如dictionary tags=new dictionary(){“Help”,“@Html.ActionLink(…)”}@Html.MyFn(tags)
其中MyFn将读取第二个字符串并对其进行求值(不知何故-我还不太擅长C#知道怎么做)@ekkis:没错。它应该是一本字典
;这些值应该是可以使用[contents]
调用的委托。这给了你一个放置所有标签的地方。听起来很合理,但我想不透。。。所以我会有@Html.MyFn(“帮助”、@Html.ActionLink())
?这真的很像模板制作。。。以上是一个很好的“标签”更换,但如果我有2它变得复杂。。。想法?@ekkis:你应该在函数中替换标记。是的,但问题是没有好的方法来实现通用性。。。除非我要传递一个字典,其中术语是要替换的标记,定义是要运行的某段代码,例如dictionary tags=new dictionary(){“Help”,“@Html.ActionLink(…)”}@Html.MyFn(tags)
其中MyFn将读取第二个字符串并对其进行求值(不知何故-我还不太擅长C#知道怎么做)@ekkis:没错。它应该是一本字典
;这些值应该是可以使用[contents]
调用的委托。这给了你一个放置所有标签的地方。这是一个不错的方法,但我从来都不喜欢这种方法的位置性。SLaks的讨论最终得出了一个很好的解决方案。为了解决这个问题,我在这里回答这个问题。这是一个不错的方法,但我从来都不喜欢这种方法的位置性。SLaks的讨论最终得出了一个很好的解决方案。为了解决这个问题,我在这里回答