从IIS7中的虚拟目录运行ASP.NET MVC应用程序

时间:2011-06-15 15:24:17

标签: asp.net-mvc-3 iis-7

是否可以从IIS7中的虚拟目录运行MVC应用程序?我在ASP.NET MVC3中构建了一个开源实用程序应用程序,并想知道这是否是一个错误;可能是因为无法从虚拟目录运行该站点。

如果从名为 / app 的虚拟目录运行,则采用 / home / index 的简单默认路由,实际上是/ app / home index。哪种方式会让路由变得混乱。

我不希望用户必须更改路由并重新编译项目以在虚拟目录中使用该应用程序。有没有办法更改配置参数以指示应用程序的根文件夹是什么?

5 个答案:

答案 0 :(得分:20)

  

是否可以从IIS7中的虚拟目录运行MVC应用程序?

不仅可行,而且是首选方式。

  

哪种方式会让路由变得混乱。

如果您在处理将处理此问题的网址时使用Html帮助程序,则不会。

以下是您不应该做的典型例子:

<script type="text/javascript">
    $.ajax({
        url: '/home/index'
    });
</script>

以及这是如何做到的:

<script type="text/javascript">
    $.ajax({
        url: '@Url.Action("index", "home")'
    });
</script>

这是另一个你不应该做的事情的典型例子:

<a href="/home/index">Foo</a>

以下是这样写的:

@Html.ActionLink("Foo", "Index", "Home")

这是你永远不应该做的事情的另一个例子:

<form action="/home/index" method="opst">

</form>

以下是这样写的:

@using (Html.BeginForm("Index", "Home"))
{

}

我认为你明白了。

答案 1 :(得分:3)

是的,工作正常,不,it doesn't mess up routing。但是,您正在运行的应用程序可能存在错误,并且不支持该配置。

您不需要“配置参数”,因为IIS和ASP.NET已经正确处理了这个问题。

但是,您需要避免在视图中使用硬编码的URI。

,例如,这样做:

<img src="<%: Url.Content("~/Content/Images/Image.png") %>" />

...而不是:

<img src="/Content/Images/Image.png" />

......类似于链接和样式表引用。

答案 2 :(得分:3)

据我所知,路由都是基于应用程序根目录而不是实际根目录,因此请将其视为以~/开头,而不是/

答案 3 :(得分:2)

是的,这有效。只要您使用辅助方法创建操作URL(例如<%=Html.ActionLink(...) %>),就无需重新配置或重新编译。

答案 4 :(得分:0)

为了防患于未然,我遇到了一个问题,我的MVC操作是动态的,因此我无法让.net使用接受的答案文章中描述的方法为我生成正确的url。我可以在服务器端使用“〜/”,但不能在javascript等中使用。我的解决方案是编写一个共享方法,该方法使用从以下位置获得的应用程序名称来构建url:

System.Web.HttpRuntime.AppDomainAppVirtualPath

示例:“ / maint / Manage / Users”,其中“ maint”是我的应用程序的名称,在某些服务器上可能有所不同,“ Manage”是我的控制器的名称和“ Users” ”是来自数据库的动态操作:

return string.Format("{0}/Manage/{1}", HttpRuntime.AppDomainAppVirtualPath, MenuName);