0

有没有办法在尝试渲染之前检查 ViewComponent 的 View 是否真的存在?

我知道有FindViewGetView方法可以从控制器中搜索视图,我正在为 ViewComponents 寻找类似的东西。

ViewComponent内部,有一个ViewEngine,但是当我尝试使用它时...

ViewEngine.FindView(ViewContext, "SomeView", false);

... 结果的 SearchedLocations 不是在寻找 ViewComponents:

[0]: "/Views/Home/SomeView.en-US.cshtml"
[1]: "/Views/Home/SomeView.en.cshtml"
[2]: "/Views/Home/SomeView.cshtml"
[3]: "/Views/Shared/SomeView.en-US.cshtml"
[4]: "/Views/Shared/SomeView.en.cshtml"
[5]: "/Views/Shared/SomeView.cshtml"
[6]: "/Pages/Shared/SomeView.en-US.cshtml"
[7]: "/Pages/Shared/SomeView.en.cshtml"
[8]: "/Pages/Shared/SomeView.cshtml"

注意:问这个问题是因为 try-catch 块没有捕捉到缺少视图时发生的异常,例如...

public IViewComponentResult Invoke()
{      
    try
    {
        return View();
    }
    catch (Exception e)
    {
        return Content(string.Empty);
    }
}

... 由于缺少视图文件,会导致未处理的异常。

4

2 回答 2

0

正如您在此处看到的,该ViewComponentResult.ViewComponent方法使用在类顶部声明的硬编码值构建所需视图的路径。所以在内部,调用ViewEngine.FindView是通过作为视图名称传递到所需视图的相对路径来执行的,即Components/{ComponentName}/{ViewName}. 然后,视图引擎使用您在示例中看到的路径作为基础搜索此路径。

要回答你的问题,你应该编辑你的代码来做同样的事情,所以它应该是

ViewEngine.FindView(ViewContext, "Components/ViewComponentName/SomeView", false);

放置在 中的视图示例/Views/Shared/Components/Navigation/Default.cshtml

于 2021-07-14T10:21:52.287 回答
0

您可以注入IViewComponentSelector控制器以检查组件是否存在:

控制器:

private readonly IViewComponentSelector _selector;
        public HomeController(IViewComponentSelector selector)
        {
            _selector = selector;
        }
public IActionResult Index()
        {
            if (_selector.SelectComponent("CheckBox1") != null)
            {
                return Ok("exist");
            }
            else 
            {
                return Ok("Not Found");
            }
        }

结果(ViewComponent 名称为 CheckBox): 在此处输入图像描述

于 2021-07-15T02:42:59.593 回答