【问题标题】:How to determine if a View exists in ASP.NET MVC 3?如何确定 ASP.NET MVC 3 中是否存在视图?
【发布时间】:2023-04-04 02:00:01
【问题描述】:

我正在实现一个新的 ASP.NET MVC 3 应用程序,它将使用一种动态路由形式来确定从公共控制器操作返回的视图。如果动态位置没有视图,我想要一个默认视图。

把它想象成导航一个树结构。根 Controllers 文件夹中只有一个 TreeController。它有一个 Browse 操作方法,该方法接受要浏览的节点的路径。每个节点都可以有一个自定义视图,所以我需要首先尝试找到该视图并从操作方法中返回它,如下所示:

public ViewResult Browse(String path)
{
    var model = ...;

    return View(path, model);
}

所以,如果我导航到“MySite/Tree/A/B/C”,那么我希望在“\Views\Tree\A\B\C.aspx”找到一个视图。

但是,如果没有自定义视图,我需要遵循标准/默认视图(例如“\Views\Tree\Browse.aspx”)。

由于这只是此操作方法的情况,因此我认为我不应该处理由于其他情况可能导致的 NotFound 错误。而且,我不是在寻找其他帖子中描述的动态路由,因为控制器的路径是固定的。

【问题讨论】:

    标签: asp.net-mvc-3


    【解决方案1】:

    控制器不应该知道物理视图。

    您可以通过编写自定义视图引擎来做到这一点,例如:

    public class MyViewEngine: WebFormViewEngine
    {
        public MyViewEngine() 
        {
            ViewLocationFormats = ViewLocationFormats.Concat(
                new [] {"~/Views/{1}/Browse.aspx""}).ToArray();
            // similarly for AreaViewLocationFormats, etc., if needed
        }
    }
    

    查看源代码,例如,WebFormViewEngine 了解详情。

    如果您需要有条件地执行此操作(仅用于几个操作),那么您可以覆盖该类型的 FindView 并查看路由值。

    显然,如果您使用 Razor,请改为使用 Razor。

    然后,在Global.asax.cs 中使用它:

    private void Application_Start(object sender, EventArgs e)
    {
        // stuff
        ViewEngines.Engines.Add(new MyViewEngine());
    

    【讨论】:

      【解决方案2】:

      从控制器动作中这似乎有效:

      var fullPath = string.Format("~/Views/CustomStuff/{0}.cshtml", viewname);
      var mappedPath = Server.MapPath(fullPath);
      if( !System.IO.File.Exists(mappedPath) ) return View("Default");
      
      else return View(viewname);
      

      (注意:不是预编译视图)

      【讨论】:

      • 如果您确实需要检查是否可以找到视图,请改用ViewEngines.Engines.FindView()!查看此答案以获取示例:stackoverflow.com/a/947086/96175.
      猜你喜欢
      • 2010-10-31
      • 2010-09-07
      • 2013-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多