有没有办法确定作为应用程序运行的站点的根目录

时间:2014-06-25 12:23:17

标签: c# jquery asp.net-mvc

我有一个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中调试时所看到的那样,我将注释掉最上面的一个,当应用程序部署时,我必须确保底部注释掉。有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

解决方案1:

更好的方法是在IIS上本地调试它。

project properties => Web tab

Servers下方的下拉菜单中选择Local IIS,然后设置正确的Project URLhttp://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)