自定义Razor engine,自定义标签,就像nopcommerce里的@T("key")实现多国语

本文介绍了一种通过自定义ASP.NET MVC中的WebViewPage来实现视图层国际化的方案。具体做法是创建一个抽象基类WebViewPage<TModel>,并在其中实现本地化逻辑。此外,还需配置web.config以使用自定义的WebViewPage作为页面基类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先需要一个abstract class WebViewPage ,继承WebViewPage<T>


namespace Loyalty.MemberPortal.Web.Helpers
{
    public abstract class WebViewPage<TModel> : System.Web.Mvc.WebViewPage<TModel>
    {

//委托,必要,返回一个IHtmlString
        public delegate IHtmlString Localizer(string key, string range);


        private Localizer _localizer;


        public Localizer T
        {
            get
            {
                return (key, range) =>
            {

       //此段为逻辑,这边是我实现localization的代码,用了httpruntime cache,你可以写你自己的方式

                var _cacheManager = new MemoryCacheManager();
                List<FakeResourceTable> homePage = _cacheManager.Get(range, () =>
                {
                    var _mamageLocalization = new ManageLocalization();
                    return _mamageLocalization.GetHome();
                });


                var languageInstance = HttpContext.Current.Request.Cookies["languageCode"];
                var languageCode = languageInstance == null ? 0 : languageInstance.Value.TransferLanguageCodeToId();
                var value = homePage.Where(m => m.Key == key && m.LanguageId == languageCode).FirstOrDefault().Value;
                return new HtmlString(value);

            };
            }
        }


        public override void InitHelpers()
        {
            base.InitHelpers();
        }




        public override string Layout
        {
            get
            {
                var layout = base.Layout;
                return layout;
            }
            set
            {
                base.Layout = value;
            }
        }


    }


    //必要,为WebViewPage必要元素
    public abstract class WebViewPage : WebViewPage<dynamic>
    {
    }

}

然后比较重要的一步,是在web.config文件中加入次engine,这个web.config是View中的,不是project中的那个

<system.web.webPages.razor>
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />

    //原来的,默认的

    <!--<pages pageBaseType="System.Web.Mvc.WebViewPage">-->
    <pages pageBaseType="Loyalty.MemberPortal.Web.Helpers.WebViewPage">
    <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Routing" />
      </namespaces>
    </pages>
  </system.web.webPages.razor>


然后在我们的VIEW上就可以调用了

@T("joinnow", "homePage")//参数对应T(a,b)方法的参数

### 调用自定义方法的方式 在 .NET 的 Razor 视图中,`@` 符号用于嵌入 C# 代码到 HTML 中。如果要调用自定义方法,则需要先在视图的 `@functions` 或 `@code` 块中定义该方法[^1]。 以下是具体实现方式: #### 定义并调用自定义方法 可以在 Razor 文件中的 `@functions` 或 `@code` 部分定义一个方法,并通过 `@` 来调用它。例如,在以下代码片段中展示了一个简单的场景,其中定义了一个名为 `GetMessage` 的自定义方法,并将其返回值显示在页面上[^2]。 ```razor <!-- 显示自定义方法的结果 --> <p>@GetMessage("World")</p> @code { // 自定义方法定义 private string GetMessage(string name) { return $"Hello, {name}!"; } } ``` 上述代码会生成一段 HTML 输出如下所示: ```html <p>Hello, World!</p> ``` 对于更复杂的逻辑或者当需要访问模型数据时,可以结合控制器传递的数据来完成操作。例如,假设有一个从控制器传来的模型对象 `Contact`,可以通过 Razor 页面上的 `Model` 属性对其进行处理[^3]。 #### 结合模型数据调用方法 假如我们希望基于模型字段动态计算某些内容,那么可以直接利用这些字段作为参数输入给我们的自定义函数。这给出一个例子说明这种情况下的做法: ```razor <!-- 使用来自 Model 的属性 --> <p>@FormatPhoneNumber(Model.PhoneNumber)</p> @functions { // 方法用来格式化电话号码字符串 public string FormatPhoneNumber(string phoneNumber) { if (!string.IsNullOrEmpty(phoneNumber)) return "(" + phoneNumber.Substring(0, 3) + ") " + phoneNumber.Substring(3, 3) + "-" + phoneNumber.Substring(6); return "No Phone Number Provided"; } } ``` 在这个实例,假定 `Model.PhoneNumber` 是一种标准形式如 `"1234567890"` 这样的纯数字串;而 `FormatPhoneNumber()` 函数则负责把它们转换成更具可读性的 `(123) 456-7890` 形式。 ### 注意事项 需要注意的是,虽然可以在 Razor 视图内部编写业务逻辑,但这通常不是最佳实践。理想情况下应该尽量减少视图内的复杂度,保持其专注于呈现而非运算。因此建议尽可能地将实际工作转移到后台服务层或 ViewModel 类型上去执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值