1

我正在寻找一个通用的 ASP.MVC(c# 和 razor)基础项目,其中包含通用控制器、_Layout.cshtml、css 和 js,供我们的许多 webapps 扩展。

我认为使用 MvcContrib 和创建 Portable Areas 是我最好的选择

所以文件夹设置大致是这样的

基础项目

  • 内容
    • js
      • 插件
      • 杂项
    • 图片
    • css
  • 控制器
  • 意见

主项目

  • 内容
  • 控制器
  • 意见

我正在通过扩展 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 扩展设置通用基础项目的建议

4

0 回答 0