我有一个MVC应用程序。这是我对About.cshtml进行以下更改的基本设置:
@{
ViewBag.Title = "About Us";
}
<script src=@Url.Content("~/Scripts/test.js") type="text/javascript"></script>
<h2>About</h2>
<p>
Put content here.
</p>
所以我添加了对外部脚本的引用。
脚本本身包含以下内容:
$(document).ready(function () {
$.post('/Home/GetResult', null, function (data) {
alert(data);
});
});
家庭控制器中调用的方法是:
public int GetResult()
{
return 3;
}
因此,这是一个基本设置,用户点击关于GetResult方法的方法被调用,并弹出一个包含3的警告。
所以我在IIS中将其设置为一个网站,它按预期工作。单击“关于”时,弹出的消息和网站
地址为http://localhost:xx/Home/About
然后我尝试将其设置为虚拟目录。
单击“关于”时,不会弹出任何消息。
它所在的URL是:http://localhost:xx/Practise/Home/About
其中practice是虚拟目录的名称。
那么为什么消息不会出现?
现在,如果url包含虚拟目录名,它是否再也找不到该文件了?
如果需要将其作为虚拟目录托管,那么解决此问题的最佳方法是什么?
答案 0 :(得分:1)
您不应该使用硬编码的网址。试试吧
$(document).ready(function () {
$.post('@Url.Action("GetResult", "Home")', null, function (data) {
alert(data);
});
});
始终使用Url辅助函数来处理实际的物理名称
答案 1 :(得分:1)
通常我在这种情况下做的是通过路由在页面中写入URL,并让库使用一个众所周知的变量或在初始化时获取一个对象:
在您的信息页中:
var getResultUrl = '@Url.Action(...)';
在您的脚本文件中:
$(document).ready(function () {
$.post(getResultUrl, null, function (data) {
alert(data);
});
});
你必须小心这样的事情的操作顺序,其中页面脚本需要在include脚本之前运行,或者你需要做一些其他事情来调用它(将它包装在一个函数中)。