我有两个MVC Web应用程序,一个www.company.com和一个solution.company.com
网站www.company.com包含指向solution.company.com/Contact的链接,但如何在View中设置href以便能够在开发/预生产/生产环境中对其进行测试?
开发:
<a href="http://localhost:88/Contact/">Contact Us</a>
QA:
<a href="http://qa.solution.company.com/Contact/">Contact Us</a>
PRD:
<a href="http://solution.company.com/Contact/">Contact Us</a>
答案 0 :(得分:10)
您可以使用web.config设置不同的变量。为每个环境使用单独的web.config。例如。 web.release和web.debug。你可以使用相同的方式。为每个环境分隔文件
如果您使用,八达通部署。使用也可以在章鱼变量中设置。
<appSettings>
<add key="MyVariable1" value="False" />
<add key="MyName" value="akshay bheda" />
</appSetting>
现在,您可以从C#代码轻松访问此变量及其值:
string myVariable = System.Configuration.ConfigurationSettings.AppSettings["MyName"];
现在不用在那里写url,而是可以使用这个字符串。
<a href="<%= ConfigurationManager.AppSettings["someKey"] %>">
如果您不想使用八达通部署,可以按照以下步骤操作。
1。)从Configuration Manager创建新配置。它位于“构建菜单”下。 并为例如创建一个新的配置。生产 并选择从Debug或任何其他当前web.config中复制设置,这样您就不必再写了。
2.。)创建新配置后,右键单击Web.config并单击添加配置转换 之后,您将找到新配置的web.config。
在每个配置的 appSettings 部分进行更改,并在启动项目时选择您的构建配置。
将从相应配置中的 appSettings 部分进行配置设置。
答案 1 :(得分:8)
在web.config中使用<appSettings>
标记,您可以支持一个文件属性,该属性将使用它自己的一组键/值加载外部配置。这些将覆盖您在web.config中的任何设置或添加到它们。
例如
<appSettings file=".\EnvironmentSpecificConfigurations\dev.config">
<appSettings file=".\EnvironmentSpecificConfigurations\qa.config">
<appSettings file=".\EnvironmentSpecificConfigurations\prod.config">
.config文件内
<appSettings>
<add key="webaddress" value="yourwebsite.com"/>
</appSettings>
Aspx Page
<a href="<%=ConfigurationManager.AppSettings["webAddress"]%>">Link</a>
答案 2 :(得分:1)
如果由于某种原因,您没有可以指定每个环境变量的自动部署系统(如前面答案中提到的Octopus),还有其他几个选项。
1:将您的设置放在每个环境的machine.config文件中,并将该配置部署到相应的服务器。
2:将您的关系放在配置文件中:
<appSettings>
<add key="contact-for-localhost" value="http://localhost:88/Contact/" />
<add key="contact-for-qa.company.com" value="http://qa.solution.company.com/Contact/" />
<add key="contact-for-www.company.com" value="http://solution.company.com/Contact/" />
<add key="contact-for-company.com" value="http://solution.company.com/Contact/" />
</appSettings>
然后在控制器中按主机名询问设置:
var contactLink = ConfigurationManager.AppSettings[$"contact-for{Request.Url.Host}"]
并将其传递给您的模特。
由于您没有不同的配置可以切换,为了测试这种方法,您可以更改主机文件(c:\ System32 \ drivers \ etc \ hosts)以伪装成每个环境
127.0.0.1 localhost
127.0.0.1 qa.company.com
127.0.0.1 company.com
127.0.0.1 www.company.com
然后注释掉或删除非localhost条目以连接到真实服务器。
答案 3 :(得分:0)
从已经存在的答案中可以看到,您需要为编译时定义的内容更改静态字符串hrefs
。我认为您应该遵循以前的建议并为Web.Debug.config
和Web.Release.config
编写不同的标记,但不能解决您的具体情况,主要是为了定义您的连接字符串,以防每个数据库源都有不同的数据库源基
要解决您的具体情况,只需使用Url
本机MVC帮助程序,并替换您的静态href,例如<a href="@Url.Content("~/Contact")"> Contact </a>
,其中"~/"
代表您的域根目录,而不管它是哪一个。
另外,如果您在“联系人”之前没有写任何控制器名称,我假设您的应用程序中有一个ContactController,并且正在使用此地址访问其索引视图。
答案 4 :(得分:0)
如果您为MVC制作模型查看字典或为返回的模型添加了设置字典并简单地从控制器返回数据,该怎么办?
<a href="@Model["ContactUsUrl"]">Contact Us</a>
OR
<a href="@Model.Settings["ContactUsUrl"]">Contact Us</a>
或者,您可以使用具有ContactUsUrl属性的模型
<a href="@Model.ContactUsUrl">Contact Us</a>
然后在您的控制器代码中,您可以使用您想要的任何逻辑来决定它是DEV,QA还是PROD,并从关联的源中提取URL的数据,例如:数据库,配置文件,自定义设置文件。这抽象了逻辑并简化了数据在页面上的使用方式。
这是直接使用web.config的替代方法。
答案 5 :(得分:0)
提出的解决方案很好,但只需要切换一个网址恕我直言。
我会采用环境变量方法并相应地设置网址。
Contact.cshtml
@{
var env = Environment.GetEnvironmentVariable("MY_APP_ENV");
var url = env == "prod" ? "http://qa.solution.company.com/Contact/" :
env == "qa" ? "http://solution.company.com/Contact/" :
"http://localhost:88/contact/";
}
<a href="@url">Contact Us</a>
如果这是一个大项目并且您可以投入一些时间,我会将其放在每个环境的appSettings
和set up parameters.xml中,并在部署期间使用它。
答案 6 :(得分:0)
如果您想使用DotNet Core或想切换到它,那么最好实现它的环境配置能力。
官方网站上的文档:Working with multiple environments和Configuration in ASP.NET Core
Here就是一个很好的例子。
var builder = new ConfigurationBuilder()
SetBasePath(hostEnv.ContentRootPath)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{hostEnv.EnvironmentName}.json", optional: true, reloadOnChange: true);
您只需要定义3个不同的appsettings
文件。并在系统中设置ASPNETCORE_ENVIRONMENT
,您希望进行测试或开发。
或者您可以使用env.IsEnvironment("environmentname")
在运行时检查某些内容。
答案 7 :(得分:-1)
您无需为此使用应用设置。只需使用MVC中的URLHelper,就可以确保使用正确的主机名。
所以不要这样:
<a href="http://solution.company.com/Contact/">Contact Us</a>
你这样做:
<a href="@Url.Action("Index", "Contact")">Contact Us</a>
这将生成一个指向Contact
内IndexController
操作的链接。
另一种选择是使用HTMLHelper扩展方法为您生成整个标记。在这种情况下,你会这样做:
@Html.ActionLink("Index", "Contact", "Contact Us")