C# 有没有办法确定作为应用程序运行的站点的根目录
我有一个MVC4网络应用程序(C# 有没有办法确定作为应用程序运行的站点的根目录,c#,jquery,asp.net-mvc,C#,Jquery,Asp.net Mvc,我有一个MVC4网络应用程序(http://whatever/myapp/home/someprocess)作为一个单独的应用程序在默认网站(服务器上)下运行,在不同的地方,我需要引用从根开始的文件,主要是javascript(root=http://whatever/myapp/) answer中的window.location选项和其他选项不适用于我,因为它获取基本url,即http://whatever/而不是http://whatever/myapp/ 从上面的答案中摘录: •windo
http://whatever/myapp/home/someprocess
)作为一个单独的应用程序在默认网站(服务器上)下运行,在不同的地方,我需要引用从根开始的文件,主要是javascript(root=http://whatever/myapp/
)
answer中的window.location选项和其他选项不适用于我,因为它获取基本url,即http://whatever/
而不是http://whatever/myapp/
从上面的答案中摘录:•window.location.host:您将获得sub.domain.com:8080或sub.domain.com:80
•window.location.hostname:您将获得sub.domain.com
•window.location.protocol:您将获得http:
•window.location.port:您将获得8080或80
•window.location.origin:您将获得 我不想手动附加“myapp”部分的原因是每次在express调试模式下运行它时都需要更改它。我肯定错过了一些简单的事情 在我的电脑上调试时,它应该实现
http://localhost:someport/home/someprocess/
当发布到服务器时,它应该实现http://server/myapp/home/someprocess
我目前正在处理的一行代码:
var jqxhr = $.getJSON("/myapp/AutoComplete/LoadComboData", { classname: '@ViewBag.ClassName', functionname: '@ViewBag.MethodName', searchstring: value, context: contextvalue, assembly: '@ViewBag.AssemblyName' })
@*var jqxhr = $.getJSON("/AutoComplete/LoadComboData", { classname: '@ViewBag.ClassName', functionname: '@ViewBag.MethodName', searchstring: value, context: contextvalue, assembly: '@ViewBag.AssemblyName' })*@
正如您在VS2013中调试时所看到的,我注释掉了顶部的一个,而在部署应用程序时,我必须确保注释掉底部的一个。必须有更好的方法吗?解决方案1: 更好的方法是在IIS上进行本地调试 在
项目属性中
=>Web选项卡
在服务器
下,从下拉列表中选择本地IIS
,然后设置正确的项目URL
(http://localhost/myapp
)。然后创建虚拟目录
这样,在调试时就不必在这两行之间切换
解决方案2:
作为旁注,您可以使用IsDebuggingEnabled
属性,然后相应地将值分配给jqxhr
。修改system.web.compilation
元素上的debug
属性以在两种不同模式之间切换
var jqxhr = []
@if (!HttpContext.Current.IsDebuggingEnabled)
{
jqxhr = $.getJSON("/myapp/AutoComplete/LoadComboData", { classname: '@ViewBag.ClassName', functionname: '@ViewBag.MethodName', searchstring: value, context: contextvalue, assembly: '@ViewBag.AssemblyName' })
}
else
{
jqxhr = $.getJSON("/AutoComplete/LoadComboData", { classname: '@ViewBag.ClassName', functionname: '@ViewBag.MethodName', searchstring: value, context: contextvalue, assembly: '@ViewBag.AssemblyName' })
}
解决方案3:
在MVC项目中创建一个扩展,无论是否满足条件调试符号,它都会返回bool
public static bool IsDebug(this HtmlHelper htmlHelper)
{
#if DEBUG
return true;
#else
return false;
#endif
}
CSHTML:
var jqxhr = []
@if (!Html.IsDebug())
{
jqxhr = $.getJSON("/myapp/AutoComplete/LoadComboData", { classname: '@ViewBag.ClassName', functionname: '@ViewBag.MethodName', searchstring: value, context: contextvalue, assembly: '@ViewBag.AssemblyName' })
}
else
{
jqxhr = $.getJSON("/AutoComplete/LoadComboData", { classname: '@ViewBag.ClassName', functionname: '@ViewBag.MethodName', searchstring: value, context: contextvalue, assembly: '@ViewBag.AssemblyName' })
}
解决方案2和3将需要您更改web.config
中的属性,或者在调试
/发布
之间更改配置。不过,我建议采用第一种解决办法。我用过这个,效果很好。您甚至消除了一种可能的情况,即一件事可以在Express Web服务器上工作,但不能在IIS上工作(这会让您感到头疼):-)
解决方案2和3的源代码:为什么不在IIS上运行时进行调试?效果很好谢谢scheien!我认为可以得到应用程序运行的虚拟目录,因此代码是动态的,但这似乎不可能?如果站点从myapp移动到myapp2,我无论如何都必须更改代码,至少现在只更改一次。;-)谢谢欢迎你的朋友。我刚刚重写了另外两种可能的方法,但第一种是最好的。很高兴你成功了,干杯!:-)