我在IIS中的一个网站下部署了asp.net mvc应用程序作为应用程序。
控制器:
public ActionResult Index()
{
List<SelectListItem> ddlCountry = countryService.GetCountries().Select(d => new SelectListItem() { Text = d.Name, Value = d.Id.ToString() }).ToList();
ddlCountry.Insert(0, new SelectListItem() { Text = string.Empty, Value = string.Empty });
ViewData["ddlCountry"] = ddlCountry;
}
public ActionResult GetCities(int Id)
{
if (!Convert.ToBoolean(ConfigurationManager.AppSettings["InDev"]))
{
return Redirect("http://example.com/");
}
var list = cityService.GetCities(Id).Select(d => new {Id = d.Id, Name = d.Name }).ToList();
return Json(list, JsonRequestBehavior.AllowGet);
}
查看:
<tr>
<td>@Html.LabelFor(model => model.CountryId, "Country Name")</td>
<td>@Html.DropDownListFor(model => model.CountryId, ViewData["ddlCountry"] as List<SelectListItem>)</td>
<td>@Html.ValidationMessageFor(model => model.CountryId)</td>
</tr>
<tr>
<td>@Html.LabelFor(model => model.CityId, "City Name")</td>
<td>@Html.DropDownListFor(model => model.CityId, ViewData["ddlCity"] as List<SelectListItem>)</td>
<td>@Html.ValidationMessageFor(model => model.CityId)</td>
</tr>
JavaScript的:
$(document).ready(function () {
$('#CountryId').change(function () {
loadDropDown("CityId", "BookingRequest/GetCities/" + $('#CountryId').val())
$('#AreaId').html($('<option></option>').val("").html(""));
});
function loadDropDown(destinationId, Url) {
$.getJSON(Url, function (data) {
$('#' + destinationId).html($('<option></option>').val("").html(""));
$.each(data, function (index, item) {
$('#' + destinationId).append(
$('<option></option>').val(item.Id).html(item.Name)
);
});
});
}
});
当我将其作为网站下的应用程序部署到IIS时,它会正确加载城市。网址与http://www.example.com/applicationname/BookingRequest
类似。当我更改国家/地区下拉值时,它会执行http://www.example.com/applicationname/BookingRequest/GetCities/2
并且一切正常。
但是当我在visual studio上运行并更改国家/地区时,它会在错误的网址上执行getCities:http://localhost:506084/BookingRequest/BookingRequest/GetCities/2
我的问题是为什么在从visual studio和IIS运行的localhost上行为不同?是否由于在IIS网站内部署为Web应用程序?或者它与我的浏览器有什么关系?
以下是来自IE的Web开发人员工具的请求的快照。
答案 0 :(得分:2)
要在MVC中获得正确的相对路径,我们需要做以下事情。
在MVC视图中
<script>
var strUrl = '@Url.Action("actionName", "controllerName")';
</script>
在Javascript中:
获取该变量&#34; strUrl&#34;并在你的ajax代码中使用。
$.ajax({
type: "GET",
url: strUrl ,
contentType: "application/json; charset=utf-8",
dataType: "html",
success: function (data) {
});
答案 1 :(得分:1)
好像您已在项目设置中输入了IIS Express的已写入网址。
打开Web项目的属性,然后转到“Web”标签,将“Project Url”更改为http://localhost:506084/BookingRequest/
到http://localhost:506084/
或http://localhost:506084/applicationname
。
但是如果它在应用程序文件夹中并不重要,MVC Webapps中的URL应始终与应用程序路径相关(使用~/Relative/Url/Here
)。
话虽如此......不要在你的代码中硬编码你的根URL。使用return Redirect("/")
(域根)或return Redirect("~/")
(应用程序根目录)。
答案 2 :(得分:0)
您需要指定应用程序的基本URL。为此,您需要在每个页面上添加标记,或者可以在_Layout页面上添加标记。
例如:
<base href="Root URL of you aplication" />
请注意,这应该与您看到浏览器的根网址相匹配。
这样,您的应用程序将始终引用正确的根路径。