我正在寻找一个通用的 ASP.MVC(c# 和 razor)基础项目,其中包含通用控制器、_Layout.cshtml、css 和 js,供我们的许多 webapps 扩展。
我认为使用 MvcContrib 和创建 Portable Areas 是我最好的选择
所以文件夹设置大致是这样的
基础项目
- 内容
- js
- 插件
- 杂项
- 图片
- 富
- css
- js
- 控制器
- 意见
主项目
- 内容
- 控制器
- 意见
我正在通过扩展 PortableAreaRegistration 类(根据 MvcContrib 文档)注册 BaseProj 区域,所以这个 url 有效......
http://localhost/MainProj/BaseProj/
查看 PortableAreaRegistration 的 MvcContrib 代码,它还在 Content 下注册了 3 个静态路由(图像、样式、脚本)。
因此这个网址也可以正常工作......
http://localhost/MainProj/BaseProj/images/bar.jpg
只有当我使用点而不是斜线时,子文件夹才能正常工作...... htttp://localhost/MainProj/BaseProj/images/foo.bar.jpg
然而,为了组织目的,在图像、css、js 等下有子文件夹真的很有用。这些子文件夹现在将是 404
即这不起作用.... http://localhost/MainProj/BaseProj/images/foo/bar.jpg
所以问题是我如何映射图像下的子文件夹(没有点符号)?即这样可以工作.... htttp://localhost/MainProj/BaseProj/images/foo/bar.jpg
谢谢
编辑:
好吧,我想了一下,找到了解决方案。我想知道这种东西是否可能默认包含在 MvcContrib.Portable Areas 中。
首先在 BaseProjRegistration.cs 中创建一个 catch all 路由来捕获 Content 的所有子文件夹
public override void RegisterArea(AreaRegistrationContext context, IApplicationBus bus)
{
...
//static controller with catch all for all subfolders of content
context.MapRoute(
"BaseProjContent",
"BaseProj/Content/{*resourceName}",
new { controller = "Content", action = "LoadContent", resourcePath = "Content" }
);
...
}
然后在 BaseProj 中创建一个 ContentController 类,该类将扩展 MvcContrib.PortableAreas.EmbeddedResourceController。
这会将斜杠转换为点以从 DLL 加载 BaseProj 内容,即 /BaseProj/Content/images/foo/bar.jpg => /BaseProj/Content/images.foo.bar.jpg
public class ContentController : MvcContrib.PortableAreas.EmbeddedResourceController
{
public ActionResult LoadContent(string resourceName, string resourcePath)
{
string actualResourceName = resourceName.Replace("/", ".");
return base.Index(actualResourceName, resourcePath);
}
}
这对我有用,但是欢迎任何其他关于如何为许多 webapps 扩展设置通用基础项目的建议