我有一个MVC 4网络应用程序(http://whatever/myapp/home/someprocess
)在默认网站(在服务器上)作为一个单独的应用程序运行,在各个地方我需要从根目录开始引用文件,主要是在javascript(root) = http://whatever/myapp/
)。
this回答中的window.location选项对我来说不起作用,因为它获得了基本网址,即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:你会得到http://sub.domain.com
我不想手动追加“myapp”部分的原因是我每次在快速调试模式下运行时都需要更改它。当然我错过了一些简单的东西?
在我的电脑上进行调试时,它应该实现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中调试时所看到的那样,我将注释掉最上面的一个,当应用程序部署时,我必须确保底部注释掉。有更好的方法吗?
答案 0 :(得分:1)
解决方案1:
更好的方法是在IIS上本地调试它。
在project properties
=> Web tab
。
在Servers
下方的下拉菜单中选择Local IIS
,然后设置正确的Project URL
(http://localhost/myapp
)。然后创建虚拟目录。
这样在调试时就不必在这两行之间切换。
解决方案2:
作为旁注,您可以使用IsDebuggingEnabled
属性,然后相应地将值分配给jqxhr
。修改debug
元素上的system.web.compilation
属性以在两种不同模式之间切换。
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
中的属性,或更改Debug
/ {{之间的配置1}}。不过我会推荐第一个解决方案。我使用过那个,它就像一个魅力。您甚至可以消除可能的情况,即一件事在Express网络服务器上运行,但在IIS上没有(这可以让您头疼): - )
解决方案2和3的来源:Razor view engine, how to enter preprocessor(#if debug)