ASP.NET WebPages翻译和模板概念

时间:2012-05-21 18:17:29

标签: asp.net translation webmatrix concept

我刚开始玩WebPages(Razor),我想出了墙后面的一些基本概念。首先,我列出了我构建的每个站点的常用内容:

  • 友好的网址(WebPages为我做)
  • 翻译的网址(WebPages支持参数,因此易于管理)
  • 多个模板支持(默认情况下不支持WebPages,此处需要一些逻辑)
  • 每个函数的分隔代码,以避免重复(WebPages支持它在墙后)

因此,如果您考虑上面的列表,那么好的旧MVC模式就会发挥作用。 ASP.NET已经有一个MVC(3)框架,它提供了我需要的所有功能。我很清楚。在这个问题上,我试图弄清楚WebPages技术是否也是开发大规模MVC(类似)Web项目的完美平台。

我测试了WebPages的页面加载行为/链,并发现它实际上是由加载的页面和一个或多个嵌套布局构建的链。每个布局页面都有一个指向其加载器(父)页面的指针。

此时,我必须清除一些基本概念。由于WebPages通过物理文件和文件夹(路径)间接支持翻译网址来解析网址,因为我可以使用以下路径创建已翻译的文件夹和文件:.... / en / account / register我可以创建另一条路径,例如匈牙利语路径:... / hu / szemelyes / regisztracio。

我需要的只是将代码分开,因为将寄存器逻辑写入两个.cshtml文件并不是那么优雅。 WebPages支持@helpers和@functions,因此很容易创建“Account.cshtml”并创建我需要的所有功能。它是我问题的正式答案。

如果我在某个.cshtml(帮助程序)文件中编写了@function,会发生什么?它为我创建了一个继承WebPageHelper的新类。我认为这不是太优雅的方式,因为我可以创建自己的类来提供相同的功能。

我进一步研究发现,每个页面(和布局页面)都默认继承WebPage类。使用@inherits指令,我可以覆盖默认继承,以及它创建自己派生自WebPage的类的完美方法,在我的所有.cshtml文件中,我可以直接从该页面继承。

此时我可以将代码(我认为:)比使用@functions更优雅。文本翻译怎么样?我认为这是一种使用资源文件的一般方法,但是对于WebPages,我认为将文本值存储在普通的.cshtml文件中。你觉得怎么样?

最后我的register.cshtml:

@inherits Account.Register
@{
     Title = "Please Register"
}

..和我的regisztracio.cshtml:

@inherits Account.Register
@{
    Title = "Kérem regisztráljon"
}

我的Account.Register类有一个String属性Title:

public class Register : WebPage
{
    public String Title { get; set; }
    ...
}

我还有另外一件事要说。我的register.cshtml(以及regisztracio.cshtml)不包含任何html标记。我有一个默认的布局文件(_Master.cshtml),我的“View”目录下的每个页面(_Register.cshtml)都有另一个布局文件。我的代码会根据我加载的“controller”类的名称自动加载正确的页面布局文件。所以我的Register类自动加载“_Register.cshtml”布局文件。并且所有页面布局文件都会自动加载_Master.cshtml(如果访问者使用移动设备,则为_Mobile.cshtml),这是主要布局。

所以我认为这是为WebPages技术实现的MVC模式,同时保持WebPages强大的功能,如自动URL解析。

您怎么看?

所以它是我对WebPages的基本概念

1 个答案:

答案 0 :(得分:0)

我确信随着您对框架的更多了解,您将采用其他做法。对于语言翻译,您可以将文化设置与资源文件一起使用。 您可以根据查询参数通过global.asax设置当前文化设置。

初始化培养设置的示例:

CultureInfo ci = new CultureInfo("en-US");
Thread.CurrentThread.CurrentCulture = ci;
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(ci.Name);

然后,您的解决方案将无缝地使用资源字符串而不是文字字符串,从而使您的代码更清晰,更强类型。在您的情况下,它还可以避免使用两个单独的注册视图。

@inherits Account.Register
@{
    Title = StringsResource.RegisterTitle
}

根据文化设置,Title变量将包含“Please Register”文本或“Kéremregisztráljon”。

祝你好运!