ASP.NET项目中如何基于当前文化从ViewBag获取分类本地化属性
问题根因
- 资源文件的取值逻辑是固定键对应固定本地化值,你直接存入
CateName、cat.CateName这类变量标识符,资源文件只会把它当成普通字符串处理,不会自动映射到代码中cat对象的属性值 - 你已经有
CateNameLocalized属性的前提下,代码里写死取CateName,没有调用对应文化的取值逻辑,自然不会触发本地化效果
解决方案
方案1:直接使用现有Localized属性(推荐,适配你现有结构)
如果你的CateNameLocalized已经是后端根据当前请求文化赋值好的字段,直接替换取值即可,可增加兜底逻辑避免空值:
@{ foreach (var cat in ViewBag.Categories) { var showName = !string.IsNullOrWhiteSpace(cat.CateNameLocalized) ? cat.CateNameLocalized : cat.CateName; <div class="swiper-slide">@showName</div> } }
如果需要根据当前文化动态匹配对应分类名,可给Category实体加扩展方法:
using System.Globalization; public static class CategoryExtension { public static string GetLocalName(this Category cat) { var currentCulture = CultureInfo.CurrentCulture.Name; // 按你的项目文化配置调整匹配逻辑 return currentCulture switch { "zh-CN" => cat.CateNameCn, "en-US" => cat.CateNameEn, // 其他文化规则自行补充 _ => cat.CateName }; } }
Razor页面直接调用即可:
<div class="swiper-slide">@cat.GetLocalName()</div>
方案2:资源文件本地化(适合分类固定无需后台修改的场景)
如果分类值是固定的,不需要后台动态增改,可走资源文件实现:
- 以
cat.CateName的默认值作为资源键,在对应语言的资源文件(如SharedResource.zh-CN.resx、SharedResource.en-US.resx)中添加对应本地化值,注意键要和CateName的实际值完全一致 - Razor页面注入本地化服务后取值即可,示例如下:
@inject IStringLocalizer<SharedResource> Localizer @{ foreach (var cat in ViewBag.Categories) { <div class="swiper-slide">@Localizer[cat.CateName]</div> } }
内容的提问来源于stack exchange,提问作者Ayden
相关产品推荐
相关产品推荐

