定义一个类

public class Book
{
    public int ID { get; set; }
    public string Title { get; set; }
    public string Author { get; set; }
    public double Price { get; set; }
    public double Action { get; set; }
}

右击项目-添加ASP.NET文件夹-创建App_GlobalResources-右击此文件夹-添加-资源文件,命名为Resource1.resx。这个文件是一个以文件名为类名的类型,名称和值分别代表了Book模型的属性名字的存取键和属性名字的存取值,Book的属性们是以键值对的方式被添加到资源文件的。注意将资源文件类的访问修饰符设为public。

接下来再复制一份Resource1.resx,命名为Resource1.zh.resx,前一个表示默认的英文,后一个表示中文。

为Book的属性添加数据注解

public class Book
{
    [Display(Name = "IDDisplay", ResourceType = typeof(App_GlobalResources.Resource1))]
    public int ID { get; set; }     [Display(Name = "TitleDisplay", ResourceType = typeof(App_GlobalResources.Resource1))]
    public string Title { get; set; }     [Display(Name = "AuthorDisplay", ResourceType = typeof(App_GlobalResources.Resource1))]
    public string Author { get; set; }     [Display(Name = "PriceDisplay", ResourceType = typeof(App_GlobalResources.Resource1))]
    public double Price { get; set; }     [Display(Name = "ActionDisplay", ResourceType = typeof(App_GlobalResources.Resource1))]
    public double Action { get; set; }
}

接下来在Test方法中将默认显示的属性名绑定到ViewBag中,然后从客户端读取这些字段名称

public class DefaultController : Controller
{
    private List<Book> books = new List<Book>
    {
            new Book{  ID=, Title="寂静的春天", Author="xxx",Price=18.9 },
            new Book{  ID=, Title="此时此地", Author="xxx",Price=11.9 },
            new Book{  ID=, Title="无人生还", Author="xxx",Price=12.9 },
            new Book{  ID=, Title="万有引力之虹", Author="xxx",Price=15.9 },
            new Book{  ID=, Title="全球通史", Author="xxx",Price=18.9 },
            new Book{  ID=, Title="来自民间的叛逆", Author="xxx",Price=18.1 },
            new Book{  ID=, Title="雨天炎天", Author="xxx",Price=18.5 },
            new Book{  ID=, Title="荒凉天使", Author="xxx",Price=17.9 },
            new Book{  ID=, Title="精神分析引论", Author="xxx",Price=28.9 },
            new Book{  ID=, Title="伯罗奔尼撒战争史", Author="xxx",Price=48.9 }
        };     //默认显示英语
    public ActionResult Test()
    {
        ViewBag.Title = App_GlobalResources.Resource1.TitleDisplay;
        ViewBag.Author = App_GlobalResources.Resource1.AuthorDisplay;
        ViewBag.Price = App_GlobalResources.Resource1.PriceDisplay;
        ViewBag.ID = App_GlobalResources.Resource1.IDDisplay;
        ViewBag.Action = App_GlobalResources.Resource1.ActionDisplay;
        return View(books);
    }     //语言切换
    public ActionResult ChangeLanguage(string language)
    {
        Session["CurrentLanguage"] = new System.Globalization.CultureInfo(language);
        return Redirect("Test");
    }
}

在Global文件中创建Application_AcquireRequestState事件

protected void Application_AcquireRequestState(object sender, EventArgs e)
{
    if (HttpContext.Current.Session != null)
    {
        System.Globalization.CultureInfo ci = (System.Globalization.CultureInfo)this.Session["CurrentLanguage"];
        if (ci == null)
        {
            ci = new System.Globalization.CultureInfo("en");
            this.Session["CurrentLanguage"] = ci;
        }
        System.Threading.Thread.CurrentThread.CurrentUICulture = ci;
        System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture(ci.Name);
    }
}

在客户端读取数据

@model IEnumerable<WebErp.Controllers.Book>
<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Test</title>
    <style>
        #table-5 th { background:#7F66A0;color: #fff; border-bottom-width: ; }
        #table-5 td {color: #000; }
        #table-5 tr, #table-5 th{border-width: 1px; border-style: solid; border-color: #7F66A0; }
        #table-5 td, #table-5 th{ padding: 5px 10px; font-size: 12px;font-family: Verdana; font-weight: bold; }
    </style>
</head>
<body>
    @Html.ActionLink("English", "ChangeLanguage", new { language = "en" })
    @Html.ActionLink("Chinese", "ChangeLanguage",new { language="zh" })
    <table id="table-5" >
        <tr>
            <th>@ViewBag.ID</th>
            <th>
                @ViewBag.Title
            </th>
            <th>
                @ViewBag.Author
            </th>
            <th>
                @ViewBag.Price
            </th>
            
            <th>@ViewBag.Action</th>
        </tr>
        @foreach (var item in Model)
        {
            <tr>
                <td>@item.ID</td>            
                <td>@Html.DisplayFor(list => item.Title)</td>            
                <td>@Html.DisplayFor(list => item.Author)</td>            
                <td>@Html.DisplayFor(list => item.Price)</td>
                <td>@Html.ActionLink("删除","delete?ID="+item.ID)</td>
            </tr>
        }
    </table>
</body>
</html>

用过滤器实现切换多语言效果,参考:https://www.cnblogs.com/zoro-zero/p/6674442.html

ASP.NET MVC - 多国语言的简单实现的更多相关文章

  1. ASP.NET MVC:多语言的三种技术处理策略

    ASP.NET MVC:多语言的三种技术处理策略 背景 本文介绍了多语言的三种技术处理策略,每种策略对应一种场景,这三种场景是: 多语言资源信息只被.NET使用. 多语言资源信息只被Javascrip ...

  2. Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理

    这是本人第一次写,写的不好的地方还忘包含.写这个的主要原因是想通过这个来学习下EF的CodeFirst模式,本来也想用AngularJs来玩玩的,但是自己只会普通的绑定,对指令这些不是很熟悉,所以就基 ...

  3. ASP.NET MVC 4 插件化架构简单实现-思路篇

    用过和做过插件的都会了解插件的好处,园子里也有很多和讨论,但大都只些简单的加载程序集什么的,这里主要讨论的就是使用 ASP.NET MVC 4 来实现每个插件都可以完全从主站点剥离出来,即使只是一个插 ...

  4. ASP.NET MVC 4 插件化架构简单实现-实例篇

    先回顾一下上篇决定的做法: 1.定义程序集搜索目录(临时目录). 2.将要使用的各种程序集(插件)复制到该目录. 3.加载临时目录中的程序集. 4.定义模板引擎的搜索路径. 5.在模板引擎的查找页面方 ...

  5. asp.net MVC 3多语言方案--再次写, 配源码

    之前写了一篇asp.net MVC多语言方案,那次其实是为American Express银行开发的.有许多都是刚开始接触,对其也不太熟悉.现在再回过头去看,自己做一个小网站,完全用asp.net m ...

  6. 使用asp.net mvc + entityframework + sqlServer 搭建一个简单的code first项目

    步骤: 1. 创建一个asp.net mvc 项目 1.1 项目创建好结构如下 2 通过vs安装EntityFramework框架 install-package entityframework 3. ...

  7. Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理6

    接下来先做角色这一板块的(增删改查),首先要新建一个Role控制器,在添加一个RoleList的视图.表格打算采用的是bootstrap的表格. using System; using System. ...

  8. Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理8

    接下来做的是对页面的增删改查与页面与页面按钮之间的联系.先上代码和页面效果 using AuthorDesign.Web.App_Start.Common; using System; using S ...

  9. Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理10

    今天把用户的菜单显示和页面的按钮显示都做好了,下面先来个效果图 接下来说下我实现的方法: 首先我在每个方法前面都加了这个属性, /// <summary> /// 表示当前Action请求 ...

随机推荐

  1. aliyun centos7 挂载云盘

    买了云盘,在哪里放着,也没有用到,今天把她挂上去吧! 1.查看SSD云盘sudo fdisk -l 可以看到SSD系统已经识别为/dev/vdb 2.格式化云盘sudo mkfs.ext4 /dev/ ...

  2. mysql 5.7安装准备

    在5.5之后的mysql安装中,需要使用cmake来指定安装参数,下面列出关于cmake的几个常用参数: CMAKE_INSTALL_PREFIX:指定MySQL程序的安装目录,默认/usr/loca ...

  3. java基础入门-语法(1)

    因为平时用到一些java的项目,比如ElasticSearch,zookeeper等,有时也想看看里面怎么实现的,或者看到别人分析原理时候会用到java源码, 自己也想跟着学一下,最起码能看懂别人的分 ...

  4. mysql体系结构和sql查询执行过程简析

    一: mysql体系结构 1)Connectors 不同语言与 SQL 的交互 2)Management Serveices & Utilities 系统管理和控制工具 备份和恢复的安全性,复 ...

  5. thinkphp 实现分页

    一.一个条件的查询数据 查询数据自然是先要显示出数据,然后根据条件进行查询数据 (1)显示出表的数据 这个方法我还是写在了HomeController.class控制器文件中 (1.1)写了一个方法s ...

  6. Linux系统诊断必备技能之一:lsof 用法详解!

    lsof(list open files)是一个查看当前系统文件的工具.在linux环境下,任何事物都以文件的形式存在,用户通过文件不仅可以访问常规数据,还可以访问网络连接和硬件:如传输控制协议 (T ...

  7. Dubbo服务端结合maven打jar包

    <build>        <finalName>odao-weixin-user</finalName>        <resources>   ...

  8. 异常来自 HRESULT:0x80070057 (E_INVALIDARG)(转)

    莫名其妙的编译总会报错 异常来自 HRESULT:0x80070057 (E_INVALIDARG) 未能加载程序集....... 几次删除引用然后重新引用程序集还是报错 奔溃中.... 网上搜索还真 ...

  9. 历史SQL语句之一

    注释:查询该课程表下,所有的课程以及课程观看的人数统计 SELECT ml.`name` as lessonName,ml.category,ml.deleted,ml.teacherName, ml ...

  10. 基本数据类型转String,String转基本数据类型

    基本数据类型 --> 字符串 1.基本数据类型+"" String s = 5 + ""; 2.使用包装类的静态方法toString(参数),参数是要转化 ...