修改MVC默認的pageBaseType以添加功能

  試想下在MVC的前端頁面JS或者html中須要使用多語言,然後端的多語言是維護在資源文件中的,前端若是使用的話須要使用AJAX頻繁的獲取,一個頁面中可能會存在大量的須要語言轉換的地方,頻繁使用AJAX是不靠譜的。html

  參照ABP中的方式,能夠使用修改PageBaseType的方式來實現。前端

  MVC的Page頁面是繼承自System.Web.Mvc.WebViewPage的,咱們能夠寫個類來繼承自這個類並修改Page的默認繼承便可,在這個類中,咱們增長多語言的方法。web

  首先,在Views目錄下新建一個類:MultiPageWebViewPageBase.cs。內容以下:後端

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Resources;
using System.Web;
using System.Web.Mvc;
using TaskManagement.Infrastructure.Extensions;

namespace TaskManagement.UI.Views
{
    public abstract class MultiPageWebViewPageBase : MultiPageWebViewPageBase<dynamic>
    {

    }

    public abstract class MultiPageWebViewPageBase<TModel> : WebViewPage<TModel>
    {
        public ResourceManager rm = Resource.Resource.ResourceManager;

        /// <summary>
        /// Constructor.
        /// </summary>
        protected MultiPageWebViewPageBase()
        {

        }

        /// <summary>
        /// Gets localized string for given key name and current language.
        /// </summary>
        /// <param name="name">Key name</param>
        /// <returns>Localized string</returns>
        protected virtual string L(string name)
        {
            return rm.GetString(name) ?? name;
        }

        /// <summary>
        /// Gets localized string for given key name and current language with formatting strings.
        /// </summary>
        /// <param name="name">Key name</param>
        /// <param name="args">Format arguments</param>
        /// <returns>Localized string</returns>
        protected virtual string L(string name, params object[] args)
        {
            return rm.GetString(name, args) ?? name;
        }

        /// <summary>
        /// Gets localized string for given key name and specified culture information.
        /// </summary>
        /// <param name="name">Key name</param>
        /// <param name="culture">culture information</param>
        /// <returns>Localized string</returns>
        protected virtual string L(string name, CultureInfo culture)
        {
            return rm.GetString(name, culture) ?? name;
        }

        /// <summary>
        /// Gets localized string for given key name and current language with formatting strings.
        /// </summary>
        /// <param name="name">Key name</param>
        /// <param name="culture">culture information</param>
        /// <param name="args">Format arguments</param>
        /// <returns>Localized string</returns>
        protected string L(string name, CultureInfo culture, params object[] args)
        {
            return rm.GetString(name, culture, args) ?? name;
        }
    }
}
View Code

  至web.config中的ide

<system.web.webPages.razor>

下pages節,將spa

<pages pageBaseType="System.Web.Mvc.WebViewPage">

修改成:code

<pages pageBaseType="TaskManagement.UI.Views.MultiPageWebViewPageBase">

  至此,咱們就能夠在前端使用@L("Field_Common_ID")的方式來使用多語言了。固然,在js中也能夠這樣使用:orm

if (confirm("@L("Msg_Common_Confirm")"))htm

  一樣的方式,能夠在該MultiPageWebViewPageBase添加多個公用的方法以擴展前端。blog

  

  缺點:這種多語言沒法在單獨的js文件中使用,必須在繼承於MultiPageWebViewPageBase的頁面中使用。

相關文章
相關標籤/搜索