gpt4 book ai didi

asp.net-mvc-3 - 为什么注册我的 ViewEngines 的顺序似乎无关紧要

转载 作者:行者123 更新时间:2023-12-02 04:05:43 25 4
gpt4 key购买 nike

我编写了一个测试 ViewEngine,它以 View 名称“About”响应请求,并将以下内容添加到 Application_Start Global.asax 中的方法.

ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new RazorViewEngine());
ViewEngines.Engines.Add(new MyViewEngine());
FindView MyViewEngine的方法如下:
if (viewName == "About")
return new ViewEngineResult(new MyView(), this);
return new ViewEngineResult(new List<string>{"Some arbitrary search location"});

当 Home Controller 响应 About Action 时,我会期望 RazorViewEngine处理对 ~/Home/About 的请求(因为它首先被添加到 Engines 集合中)但它不是... MyViewEngine正在处理对该 URL 的调用。

Razor 可以正确处理导致 View 未命名为“About”的调用。

即使我颠倒了这两个 Add 的顺序上面的陈述,我得到完全相同的行为。如果我注释掉注册我的 View 引擎的代码,Razor 会选择 ~/Home/About正如我所料。

任何想法为什么 MyViewEngine是否在 Razor 之前创建 View 而不应如此?

最佳答案

ASP.NET MVC 询问已注册的 ViewEngines按预期在他们的注册顺序中。但是有一个问题。它在 ViewEngineCollection FindView 方法:

public virtual ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName)

此方法遍历可用的 ViewEngines要求查看,但它会执行两次。一次调用 FindView使用 useCache=true 的方法如果没有 ViewEngines提供了一个结果,它会再次使用 useCache=false 对其进行迭代.
所以在你的情况下,当它询问 RazorViewEngineuseCache=true它不会返回 View ,因为没有 chached View 。但是您的 View 引擎将始终提供 View .所以你需要处理 useCache=true您实现中的案例:
public ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
{
if (useCache)
return new ViewEngineResult(new List<string> { "Not in cache" });

if (viewName == "About")
return new ViewEngineResult(new MyView(), this);
return new ViewEngineResult(new List<string> { "Some arbitrary search location" });
}

关于asp.net-mvc-3 - 为什么注册我的 ViewEngines 的顺序似乎无关紧要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7809456/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com