Asp.net mvc 我如何在MVC中全球化视图结果,而不为每个文化创建页面?

Asp.net mvc 我如何在MVC中全球化视图结果,而不为每个文化创建页面?,asp.net-mvc,asp.net-mvc-4,Asp.net Mvc,Asp.net Mvc 4,我有一个名为HomeController的简单控制器,还有一些动作 public ActionResult Index() { return View(); } 我的索引页是 <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %> <asp:Content ID="indexTitle" ContentPlaceH

我有一个名为HomeController的简单控制器,还有一些动作

public ActionResult Index()
{
    return View();
}
我的索引页是

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>

<asp:Content ID="indexTitle" ContentPlaceHolderID="TitleContent" runat="server">
Test
</asp:Content>

<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">
Hello World,<br/>
Test
</asp:Content>


我不喜欢为每一种文化创建视图。。我只想创建一个索引视图,并将页面转换为所选区域性。

您忘记了模型视图控制器的“模型”

从本质上讲,您可以设置一个简单的模型类,其中包含要设置的变量。 在控制器中的某个位置设置这些变量,视图将显示这些变量

非常简单的例子如下

public class MyModel
{
   public string sayingOne { get; set; }
   public string sayingTwo { get; set; }
}
在控制器中

public ActionResult Index()
{
    MyModel model = new MyModel();
    if (someCondition)
    {
        model.sayingOne = "Hello";
        model.sayingTwo = "Mundo";
    }
    return View(model);
}
那么在你看来,

@Model MyModel
...    
<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">
@MyModel.sayingOne @MyModel.sayingTwo
</asp:Content>
@Model-MyModel
...    
@MyModel.sayingOne@MyModel.sayingTwo

您忘记了模型视图控制器的“模型”

从本质上讲,您可以设置一个简单的模型类,其中包含要设置的变量。 在控制器中的某个位置设置这些变量,视图将显示这些变量

非常简单的例子如下

public class MyModel
{
   public string sayingOne { get; set; }
   public string sayingTwo { get; set; }
}
在控制器中

public ActionResult Index()
{
    MyModel model = new MyModel();
    if (someCondition)
    {
        model.sayingOne = "Hello";
        model.sayingTwo = "Mundo";
    }
    return View(model);
}
那么在你看来,

@Model MyModel
...    
<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">
@MyModel.sayingOne @MyModel.sayingTwo
</asp:Content>
@Model-MyModel
...    
@MyModel.sayingOne@MyModel.sayingTwo
应该让您开始。我不同意作者的假设,即你应该为每种语言创建一个视图(谈论违反DRY),但全球化的其他方面应该为你指明正确的方向

你的问题有很多,在一个非常简单的答案中,有些人很难表达出来。我会搜索有关MVC和全球化的博客/教程。

应该会让您开始学习。我不同意作者的假设,即你应该为每种语言创建一个视图(谈论违反DRY),但全球化的其他方面应该为你指明正确的方向


你的问题有很多,在一个非常简单的答案中,有些人很难表达出来。我会搜索关于MVC和全球化的博客/教程。

这个问题在这里被问到并回答了:。不确定为什么正确的答案(该社区投了27票)没有被选为正确答案,但这正是使ASP.NET MVC项目全球化/本地化的方法

复制粘贴:

您可以使用与以下任何其他应用程序相同的方式对其进行本地化:

  • 创建一个文件夹,称之为Resources
  • 右键单击文件夹并添加类。。。选择资源文件。可以随意称呼它,例如Strings.resx
  • 在文件属性下,将自定义工具更改为
    PublicResXFileCodeGenerator
  • 使用翻译键和值对填充资源文件(这将是默认翻译)
  • 使用其所在区域性的名称以以下格式创建其他资源:{name}.de.resx,例如Strings.de.resx
  • (适用于Razor)打开Views文件夹中的web.config,并将其添加到/configuration/system.web.webPages.Razor/pages/namespace:(假设resources是您在其中创建资源的文件夹的名称,并且您没有更改资源文件本身的默认名称空间)。这一步意味着您不必每次引用翻译时都完全限定视图中的资源类
  • 使用翻译来代替视图中的文本,如以下代码所示:

    @Strings.MyString
    
  • 字符串将根据CultureInfo.CurrentCulture在视图中自动转换,但这不是为您自动设置的

    您需要更改
    CurrentCulture
    (可能在
    应用程序中_BeginRequest
    )。如何做到这一点取决于您,它可以是设置它的路由值,也可以是用户的浏览器语言

    您可以在
    HttpContext.Current.Request.UserLanguages
    中找到用户首选语言的列表(按顺序)

    您不需要创建每个区域性的视图,您可以创建带有palceholder的视图模型,palceholder将从资源中获取它们的值,您可以创建每个区域性的资源(字符串列表),而不是每个区域性的视图


    希望这将对您有所帮助

    此问题已在此处提出并回答:。不确定为什么正确的答案(该社区投了27票)没有被选为正确答案,但这正是使ASP.NET MVC项目全球化/本地化的方法

    复制粘贴:

    您可以使用与以下任何其他应用程序相同的方式对其进行本地化:

  • 创建一个文件夹,称之为Resources
  • 右键单击文件夹并添加类。。。选择资源文件。可以随意称呼它,例如Strings.resx
  • 在文件属性下,将自定义工具更改为
    PublicResXFileCodeGenerator
  • 使用翻译键和值对填充资源文件(这将是默认翻译)
  • 使用其所在区域性的名称以以下格式创建其他资源:{name}.de.resx,例如Strings.de.resx
  • (适用于Razor)打开Views文件夹中的web.config,并将其添加到/configuration/system.web.webPages.Razor/pages/namespace:(假设resources是您在其中创建资源的文件夹的名称,并且您没有更改资源文件本身的默认名称空间)。这一步意味着您不必每次引用翻译时都完全限定视图中的资源类
  • 使用翻译来代替视图中的文本,如以下代码所示:

    @Strings.MyString
    
  • 字符串将根据CultureInfo.CurrentCulture在视图中自动转换,但这不是为您自动设置的

    您需要更改
    CurrentCulture
    (可能在
    应用程序中_BeginRequest
    )。如何做到这一点取决于您,它可以是设置它的路由值,也可以是用户的浏览器语言

    您可以在
    HttpContext.Current.Request.user中找到用户首选语言的列表(按顺序)