MVCSiteMapProvider的资源文件

时间:2012-07-02 10:49:00

标签: asp.net-mvc-2 sitemap mvcsitemapprovider

我正在使用MVCSiteMapProvider为我的应用程序生成具有本地化的菜单。只要菜单的资源文件位于App_GlobalResources文件夹中,我的程序就可以正常工作。当我将资源移动到另一个文件夹时,它会提示错误,提示无法找到资源。 我正在使用$resources:Resource,menu_Home来访问MVC.sitemap文件中的资源。 我想将资源文件保存在自定义文件夹中,而不将它们存储在App_GlobalResources文件夹中。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

由于MvcSiteMapNode.Title属性中的以下代码而发生:

var implicitResourceString = GetImplicitResourceString("title");
if (implicitResourceString != null && implicitResourceString == this["title"])
{
    return implicitResourceString;
}
implicitResourceString = GetExplicitResourceString("title", this["title"], true);
if (implicitResourceString != null && implicitResourceString == this["title"])
{
    return implicitResourceString;
}

在GetExplicitResourceString()方法中,last参数为true,表示throwIfNotFound。这就是抛出异常的原因。我通过使用以下代码替换上面的代码来修复它:

if (!string.IsNullOrEmpty(title))
{
    if (Provider.EnableLocalization)
    {
        try
        {
            if (!string.IsNullOrEmpty(title) && title.Contains("."))
            {
                int idx = title.LastIndexOf(",");
                string res = title.Substring(0, idx);
                string assembly = title.Substring(idx + 1);

                idx = res.LastIndexOf(".");
                string type = res.Substring(0, idx);
                string key = res.Substring(idx + 1);
                var rm = new ResourceManager(type, Assembly.Load(assembly));
                return rm.GetString(key);
            }
        }
        catch
        {
        }
        return title;
    }
}

并且在.sitemap文件中而不是title =“$ resources:Resource,Key”语法使用title =“Namespace.Class.Property,Assembly”语法,这在使用时使用具有强类型生成类的嵌入资源更合适。