在IIS上运行MVC应用程序的行为与运行Visual Studio localhost时的行为不同

时间:2015-04-06 10:50:39

标签: c# jquery ajax asp.net-mvc

我在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开发人员工具的请求的快照。

enter image description here

3 个答案:

答案 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" />

请注意,这应该与您看到浏览器的根网址相匹配。

这样,您的应用程序将始终引用正确的根路径。