3

我在 MVC 2 应用程序中使用便携式区域。我在文件夹 /Scripts/ViewModels/ViewModel.js 中有一个 javascript 文件,但是当我尝试访问它时,我收到一个 404 错误,因为找不到。便携式区域的注册如下所示:

private void RegisterRoutes(AreaRegistrationContext context)
    {
        context.MapRoute(
          AreaName + "_resources",
          base.AreaRoutePrefix + "/resource/{resourceName}",
          new { controller = "EmbeddedResource", action = "Index"},
          new[] { "MvcContrib.PortableAreas" }
        );

        context.MapRoute(
          AreaName + "_scripts",
          base.AreaRoutePrefix + "/Scripts/{resourceName}",
          new { controller = "EmbeddedResource", action = "Index", resourcePath = "scripts" },
          new[] { "MvcContrib.PortableAreas" }
        );

        context.MapRoute(
            AreaName + "_images",
            base.AreaRoutePrefix + "/images/{resourceName}",
            new { controller = "EmbeddedResource", action = "Index", resourcePath = "images" },
            new[] { "MvcContrib.PortableAreas" }
       );

        context.MapRoute(
            AreaName + "_default",
            base.AreaRoutePrefix + "/{controller}/{action}/{id}",
            new { action = "Index", id = UrlParameter.Optional },
            new[] { "PortableAreaDemo.PortableAreas.Areas.Demo.Controllers", "MvcContrib" }
        );
    }

在视图模板中,我尝试包含脚本文件 <script src="@Url.Content("~/Demo/Scripts/ViewModels/ViewModel.js")"></script> 并获得以下 url /Demo/Scripts/ViewModels/ViewModel.js,但该文件不可访问。我只能访问作为 Scripts 文件夹的直接子级的脚本文件。

4

3 回答 3

2

来自关于路由的MSDN 文档,

有时您必须处理包含可变数量的 URL 段的 URL 请求。定义路由时,您可以指定如果 URL 的段数多于模式中的段数,则将额外的段视为最后一段的一部分。要以这种方式处理其他段,请用星号 (*) 标记最后一个参数。这被称为包罗万象的参数。带有 catch-all 参数的路由也将匹配不包含任何最后一个参数值的 URL。

因此,您应该尝试*在脚本路径的参数开头添加一个,例如,base.AreaRoutePrefix + "/Scripts/{*resourceName}",这将允许将参数作为一个包罗万象进行处理。然后resourceName可以将 分配给/ViewModel.js/ViewModels/ViewModel.js。如果没有*,则该/ViewModels段被视为另一个段,这会导致路由引擎不将此路由评估为匹配项,并继续通过定义的路由,这404是没有与提供的 URL 路径模式匹配的路由的结果。

于 2013-10-25T14:43:31.300 回答
0

在这里回答

在 Web.Config 中为每种文件类型添加:

<system.webServer>
  <handlers>
    <add name="js" path="*.js" verb="*" type="System.Web.Handlers.TransferRequestHandler" resourceType="File" preCondition="integratedMode" />
  </handlers>
</system.webServer>

这将使 IIS 尝试使用定义的路由而不是搜索静态文件。

于 2014-09-12T20:00:03.230 回答
0

编写以下路由[必须在“/Scripts/{resourceName}”路由之前插入]

context.MapRoute(
      AreaName + "_viewmodels_scripts",
      base.AreaRoutePrefix + "/Scripts/viewmodels/{resourceName}",
      new { controller = "EmbeddedResource", action = "Index", resourcePath =     "scripts.viewmodels" },
      new[] { "MvcContrib.PortableAreas" }
    );

并且不要忘记将脚本的“构建操作”设置为“嵌入式资源”

于 2014-03-18T09:12:57.277 回答