我有一个ASP.Net MVC网站,“在线学习普通话”。它是可操作的,它对我来说很好。现在,我想重新使用这个网站作为新网站的模板,“在线学习西班牙语”。这两个网站将位于完全不同的域和完全不同的服务器上。
对于我的“在线学习普通话”网站, 1/3的网页是外部页面,用户可以在不登录网站的情况下浏览。 其他2/3的网页是内部页面,用户只有在登录网站时才能看到。我希望两个网站都使用不同的外部网页(两个网站的外部.aspx页面会有所不同),但两个网站共享同一组内部网页(内部.aspx页面对于两个网站都是相同的)。
我的问题是,在ASP.Net MVC中,我如何为两个网站构建我的项目/解决方案?由于两个网站的唯一区别是外部页面,我能想到的最简单的处理外部页面的解决方案是在数据库中存储每个视图的映射,从数据库中基于某个常量(即.TartarType)获取此映射在web.config中设置,然后根据映射返回视图。例如,在我的控制器中:
// WebsiteType is stored in web.config. It is set to LearnMandarin for the learn Manadarin
// online website and it is set to LearnSpanish for the learn Spanish online website
string websiteType = WebConfigurationManager.AppSettings["WebsiteType"];
// figure out which Homepage .aspx view to return, based on the websiteType
// GetView(...) will get the mapping from the database
string viewToReturn = GetView(websiteType, "HomepageView");
return View(viewToReturn);
这是我能想到的最干净的解决方案,也是我能想到的最好的结构。我最终会在同一目录中有两个不同的.aspx文件 - 一个用于学习普通话在线网站的.aspx页面,另一个用于学习西班牙语在线网站的.aspx文件。这是构建我的项目的最佳方式还是更清洁的方式?
(我使用的是Visual Studio 2010和ASP.Net MVC 3.0.0.0版)
答案 0 :(得分:0)
嗯,我会同意@Haney的某种程度。这实际上取决于网站的普通话/西班牙语保护部分有多么不同。通常,受保护和未受保护的部分之间的划分很简单。应仅使用[Authorize]
属性保护仅对登录用户可用的控制器/操作。例如,要执行诸如将仅注册普通话的用户限制为普通话部分的操作,您将使用角色。将用户分配到"普通话"例如,角色,然后指定只有该角色的用户才能访问它:[Authorize(Roles = "Mandarin")]
。
在普通话和西班牙语部分之间的区别开始变得越来越多。对于大多数事情,您实际上可以使语言成为路由参数。换句话说,所有普通话页面都会有/mandarin/some/page/
之类的网址,而西班牙语网页则会有/spanish/some/page/
之类的网址。您可以使用route参数,然后切换布局,分支内部操作或视图等。但是,如果这两个部分之间存在很大差异,则所有这些分支都可能导致一些复杂的代码。如果是这种情况,那么将每种语言创建为单独的区域可能更合适。每个区域都将获得一个隔离的路由方案,即如果您的区域名为Mandarin
,则该区域中的每个控制器操作都将自动位于/mandarin/some/page/
之类的URL下。你不必捕获"普通话"确定正在使用的语言的路线的一部分:只要通过在该区域内点击控制器动作,您就会知道。但是,这种方法的缺点是你最终可能会遇到一些代码重复。您可以通过控制器和视图继承来阻止大部分内容,但是在某些情况下,您仍然可以在两个区域中都存在非常相似的代码。
答案 1 :(得分:0)
我或多或少使用了哈尼建议的区域。我在我的项目中创建了一个名为SpanishTutor的区域。创建区域后,它将具有与典型ASP.Net MVC项目相同的控制器和视图文件夹结构(但它将全部位于Areas子文件夹下)。我认为我的主页是我的一个"外部"页面。因此,我在"控制器"中创建一个HomeController.cs文件。我的SpanishTutor区域下的文件夹。对于这个HomeControllers.cs文件,我不得不将命名空间更改为" Tutors.Areas.SpanishTutor.Controllers"这样它就不会与现有的HomeController.cs文件发生冲突。我还在" views"下创建了一个带有Index.aspx的Home文件夹。我的SpanishTutor区域中的文件夹。
接下来,我需要为我的"在线学习西班牙语"主页覆盖我的"在线学习普通话的路由"主页。创建SpanishTutor区域时,会创建名为SpanishTutorAreaRegistration.cs的.cs文件。在该文件中,将以下代码添加到RegisterArea(...):
public override void RegisterArea(AreaRegistrationContext context)
{
string websiteType = WebConfigurationManager.AppSettings["WebsiteType"];
if (websiteType.Contains("spanishtutor"))
{
context.MapRoute(
"SpanishTutor_Root", // Route name
"", // override the homepage
new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
new[] { "Tutors.Areas.SpanishTutor.Controllers" } // namespace so there is no conflict with the namespace of the original homeapge
);
}
}
如果您有更多外部网页,则可以像主页一样添加每个外部网页。对我来说,没有必要修改Global.asax.cs。
在我的web.config中,添加以下内容(我可以将其更改为" mandarintutor"用于"在线学习普通话"网站):
<add key="WebsiteType" value="spanishtutor" />