在IIS7中的虚拟目录中运行MVC应用程序是否可行?我已经在ASP.NET MVC3中构建了一个开源实用程序应用程序,并想知道是否犯了一个错误;如果该站点无法从虚拟目录运行,则可能是这样。如果从名为/app的虚拟目录运行简单的默认路由/home/index,实际上将是/app/home index。这会对路由造成一些混乱。我不希望用户更改路由并重新编译项目以在虚拟目录中使用该应用程序。是否有一种方法可以更改配置参数以指示应用程序的根文件夹是什么?
在IIS7中从虚拟目录运行MVC应用程序是可能的,而且这是首选的方式。
使用Html helpers来处理url时可以解决路由问题。
以下是一种典型的不应该做的方法的例子:
<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"))
{
}
我想你已经明白了。
是的,这很好用,不会影响路由。但是,你运行的应用程序可能有漏洞,不支持该配置。
你不需要“配置参数”,因为IIS和ASP.NET已经正确处理了这个问题。
然而,你需要避免在视图中使用硬编码的URI。
例如,这样做:
<img src="<%: Url.Content("~/Content/Images/Image.png") %>" />
...而不是:
<img src="/Content/Images/Image.png" />
同样地,链接和样式表引用也是如此。
~/
开头,而不是/
。是的,这个可以用。只要你使用帮助方法来创建操作URL(例如<%=Html.ActionLink(...) %>
),就不需要重新配置或重新编译。
如果有人需要帮助,我遇到了一个问题,我的MVC操作是动态的,所以我不能使用.NET使用接受答案帖子中描述的方法为我生成正确的URL。我可以在服务器端使用“~/”,但无法在JavaScript等客户端使用。我的解决方案是编写一个共享方法,使用从以下获取的应用程序名称构建URL:
System.Web.HttpRuntime.AppDomainAppVirtualPath
示例:"/maint/Manage/Users",其中"maint"是我的应用程序名称,在某些服务器上可能不同,"Manage"是我的控制器名称,而"Users"是从数据库中获取的动态操作。return string.Format("{0}/Manage/{1}", HttpRuntime.AppDomainAppVirtualPath, MenuName);