gpt4 book ai didi

razor - MVC4 Razor 自定义 View 定位器

转载 作者:行者123 更新时间:2023-12-01 09:02:46 26 4
gpt4 key购买 nike

我正在开发一个旨在为两个域提供服务的 MVC4 应用程序。我们的大部分内容将跨域共享,但有时我们需要根据请求来自哪个站点来呈现不同的标记(使用 Razor)。

理想情况下,我想要一种基于约定的方法,允许我拥有这样的文件夹结构:

Views
+ Domain1
+ ControllerName
View1
View2
+ Domain2
+ ControllerName
View1
+ ControllerName
View1
View2

解析 View 时,我想先检查特定于域的文件夹,然后检查一般 View 文件夹。

我的第一个想法是实现一个继承 RazorViewEngine 的自定义 View 引擎,该引擎将根据请求域交换 ViewLocationFormats 字符串。不幸的是,所有这些东西都隐藏在 VirtualPathProviderEngine 中,无法被覆盖。

最佳答案

事实证明,答案是为每个知道域特定文件夹的域创建一个自定义 View 引擎(继承自 RazorViewEngine):

public class Domain1ViewEngine() : RazorViewEngine
{
...

ViewLocationFormats = new[]
{
"~/Views/Domain1/{1}/{0}.cshtml",
"~/Views/Domain1/Shared/{0}.cshtml"
};

...
}

然后我需要重写 FindViewFindPartialView 方法,以便它仅在请求来自正确域时才尝试查找定位 View :

public override ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache)
{
if ([THIS IS NOT THE RIGHT DOMAIN])
{
return new ViewEngineResult(new string[] { });
}

return base.FindView(controllerContext, viewName, masterName, useCache);
}

为了完成这个过程,我以通常的方式在 Global.asax.cs 中注册了 View 引擎:

protected void Application_Start()
{
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new Domain1ViewEngine());
ViewEngines.Engines.Add(new RazorViewEngine());
}

关于razor - MVC4 Razor 自定义 View 定位器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13842638/

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