在MVC 3中的多个位置搜索.cs.html

本文关键字:位置 搜索 cs html MVC | 更新日期: 2023-09-27 18:00:09

当用户来到我的网站时,查询字符串中可能传递了一个template=foo。正在验证该值并将其存储在Session中。

我的文件布局如下:

- Views/
  - Templates/
    - test1/
      - Home
        - Index.cshtml
    - test2/
      - Home
        - List.cshtml
  - Home/
    - Index.cshtml

基本上,如果用户使用template=test1请求Index,我希望使用Views/Templates/test1/Index.cshtml。如果他们有template=test2,我想使用Views/Home/Index.cshtml(因为/Views/Templates/test2/Home/Index.cshtml不存在)。如果他们没有传递模板,那么它应该直接进入Views/Home

我是MVC和.NET的新手,所以我不知道从哪里开始寻找。我使用MVC3和Razor作为视图引擎。

在MVC 3中的多个位置搜索.cs.html

您可以通过创建自定义RazorViewEngine并设置ViewLocationFormats属性来实现这一点。这里有一个示例通过覆盖WebFormViewEngine来实现这一点,但使用RazorViewEngine也应该同样有效:

public class CustomViewEngine : WebFormViewEngine
{
    public CustomViewEngine()
    {
        var viewLocations =  new[] {  
            "~/Views/{1}/{0}.aspx",  
            "~/Views/{1}/{0}.ascx",  
            "~/Views/Shared/{0}.aspx",  
            "~/Views/Shared/{0}.ascx",  
            "~/AnotherPath/Views/{0}.ascx"
            // etc
        };
        this.PartialViewLocationFormats = viewLocations;
        this.ViewLocationFormats = viewLocations;
    }
}

您可以根据需要修改Scott Hanselman的移动设备演示。不用检查用户代理,或者如果它是移动设备,你可以把你的逻辑放进去检查查询字符串或会话变量。