【问题标题】:Routing and multiple views in Asp.Net MVCAsp.Net MVC 中的路由和多个视图
【发布时间】:2012-03-08 21:52:22
【问题描述】:

我有一个需要能够为多个视图提供服务的控制器操作方法。这些视图由 XSLT 生成。

现在,视图中有图像(每个视图有数百个),并且每个视图都需要有自己的包含图像的文件夹以供参考。这应该如何工作?

如果源 XML 中的图像的 href 是一个简单的相对路径(“images/image.svg”),我怎样才能让这个路径在应用程序的视图中解析?

如果我可以将图像文件夹放在与视图相同的文件夹中,并在那里使用相对路径,那会很容易,但这不起作用,因为我从动作中提供多个视图。这是路由:

routes.MapRoute(
                "Parameter",
                "{controller}/{action}/{lang}/{prod}",
                new { controller = "Manuals", action = "Product", lang = "en-US", prod = "sample" }
        );

因此,如果我尝试对 img src 属性使用相对路径,它会解析为类似“/Manuals/Product/en-US/images/image.svg”的内容

事实上,如果我把它相对于视图来说,图像位于“/Views/Manuals/en-US/images/image.svg”

那么有没有办法在 Asp.Net MVC 中拥有像这样的相对图像路径?还是我完全误解了 MVC 路由?

【问题讨论】:

    标签: asp.net-mvc-3 routing relative-path


    【解决方案1】:

    这是我之前做过的:

    public class MvcApplication : HttpApplication
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());
        }
    
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
            MapRoute(routes, "", "Home", "Index");
            /* other routes */
            MapRoute(routes, "{*url}", "Documentation", "Render");
        }
    }
    

    现在所有不匹配的路由都被传递给DocumentationController。我的文档控制器如下所示:

    public class DocumentationController : Controller
    {
        public ActionResult Render(string url)
        {
            var md = new MarkdownSharp.Markdown();
            // The path is relative to the root of the application, but it can be anything
            // stored on a different drive.
            string path = Path.Combine(Request.MapPath("~/"), GetAppRelativePath().Replace('/', '\\')) + ".md";
            if (System.IO.File.Exists(path))
            {
                string html = md.Transform(System.IO.File.ReadAllText(path));
                return View("Render", (object)html);
            }
    
            // return the not found view if the file doesn't exist
            return View("NotFound");
        }
    
        private  string GetAppRelativePath()
        {
            return HttpContext.Request.AppRelativeCurrentExecutionFilePath.Replace("~/", "");
        }
    }
    

    所有这一切都是为了找到降价文件并相应地呈现它们。要针对您的情况更新此内容,您可能需要执行以下操作:

        routes.MapRoute(
                "Parameter1",
                "{controller}/{action}/{lang}/{*url}",
                new { controller = "Manuals", action = "Download", lang = "en-US", prod = "sample" }
        );
    

    确保它位于{controller}/{action}/{lang}/{prod} 路由之后。这应该会导致诸如/Manuals/Product/en-US/images/image.svg 甚至images/image.svg 之类的URL(如果浏览器在/Manuals/Product/en-US/sample 中调用Download 操作。然后您可以调整我编写的代码以将该URI 映射到物理位置。您可能会遇到的一个问题是“图像”被认为是产品,而/Manuals/Product/en-US/images 会认为它是产品。

    Images 动作可以如下所示。

    public ActionResult Download(string url)
    {
      /* figure out physical path */
      var filename = /* get filename form url */
      var fileStream = [...];
      Response.Headers.Remove("Content-Disposition");
      Response.Headers.Add("Content-Disposition", "inline; filename=" + filename);
      string contentType = "image/jpg";
      return File(fileStream, contentType, filename);
    }
    

    您可以在MSDN获取更多关于FileResult的信息。

    【讨论】:

    • 好的,谢谢,但我不确定我是否理解正确...我不希望图像可下载,它们应该只显示在页面上。但是当我使用相对路径时,它们不会像上面解释的那样工作......
    • 也许下载是错误的“废话”。请参阅下载的更新版本。通过将 ContentComposition 标头设置为内联,浏览器将显示图像,而不是下载图像。您必须做一些工作才能从 url 中找出实际的路径名等。我希望能澄清它。
    猜你喜欢
    • 1970-01-01
    • 2016-06-21
    • 2021-12-18
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    相关资源
    最近更新 更多