如何告诉控制器存在ASP.NET核心视图?

时间:2016-06-07 19:29:03

标签: asp.net-core-mvc

有时控制器需要检查一个视图是否存在,以便它可以采取一些行动,如果它没有?

对于早期版本的asp.net mvc,我已经看过类似的问题Does a View Exist in Asp.Net MVC?,但这些方法对ASP.NET Core不起作用。我无法从控制器内部找到有关如何使用ASP.NET Core的任何文档。

鉴于以下内容:

string viewLoc= "~/views/some-folder/some-file.cshtml";

控制器如何确定视图是否存在?

2 个答案:

答案 0 :(得分:6)

这是我在 Asp.Net Core 1.0中解决此问题的方法。使用ICompositeViewEngine。以下是一个例子。

private readonly ICompositeViewEngine _compositeViewEngine;

public YourController(ICompositeViewEngine compositeViewEngine)
{
    _compositeViewEngine = compositeViewEngine;
}

然后在你的行动中:

[Route("/location/{name}")]
public IActionResult Location(string name)
{
    var viewName = $"~/Views/Location/{name}.cshtml";
    var result = _compositeViewEngine.GetView("", viewName, false);

    if (result.Success) return View(viewName);

    // or do whatever you want
    return NotFound();
}

答案 1 :(得分:2)

在我看来,当运行时查看不存在时,这是一个糟糕的设计 - 但可能我不理解这个案例。

然而回答你的问题: 我不知道任何特定的方法来执行此操作,但是...查看是一个文件,因此您只需检查磁盘上是否存在文件?

例如:

  • System.IO.File.Exists(@"Views\Home\Index.cshtml");
  • System.IO.File.Exists(@".\Views\Home\Index.cshtml");

在这种情况下不要使用~,只需使用Views\.\Views\