ASP MVC3 - действие HttpPost не найдено после публикации - PullRequest
1 голос
/ 27 января 2012

У меня есть приложение ASP MVC3, в котором есть несколько методов HttpPost ActionResult.Во время сеанса отладки методы работают нормально.Но когда я публикую и просматриваю веб-приложение в браузере, происходит сбой только методов HttpPost.Firebug показывает «404 не найден».Другие не-HttpPost методы в том же контроллере работают нормально.

ОБНОВЛЕНИЕ:

1) Опубликованный URL-адрес приложения - localhost / psp.2) Все действия GET возвращают URL-адреса http://localhost/psp/'controller'/'action'.
3) Действия POST возвращают URL-адреса http://localhost/'controller'/'action'.

Так что, похоже, это проблема маршрутизации.Единственный маршрут, который у меня есть в моем файле Global.asax.cs:

    routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
        );

Обратите внимание, что контроллер Home НЕ содержит ни одного из действий HttpPost.Все методы POST, которые терпят неудачу, находятся в отдельном контроллере.Я попытался настроить этот маршрут так: psp/{controller}/{action}/{id}, но затем получил ошибку 403.14 (к сведению, я использую IIS 7.5).

Я сбит с толку тем, почему эти методы HttpPost работают во время отладки, но не вопубликованное приложение.Вот один из методов, которые получают ошибку 404 после публикации:

    [HttpPost]
    public ActionResult GetAreaSelTexResult(JSON_MapSelPars pars)
    {

        AreaSelTextResult myResult = new AreaSelTextResult();

        using (var ctx = new prismEntities())
        {
            var q = from p in ctx.pPSPMapSummary_Sel(pars.areaType, pars.areaName, null, null,pars.goalCDL) select p;

            // There should only be one record returned, so loop will iterate only once.
            foreach (var k in q)
            {
                //Move procedure results to object
                myResult.TopProjectName1 = k.TopProjectName1;
                myResult.TopProjectName2 = k.TopProjectName2;
                myResult.TopProjectName3 = k.TopProjectName3;

                myResult.TopProjectSnapshotLink1 = k.TopProjectSnapshotLink1;
                myResult.TopProjectSnapshotLink2 = k.TopProjectSnapshotLink2;
                myResult.TopProjectSnapshotLink3 = k.TopProjectSnapshotLink3;

                myResult.TotalProjectAmt = string.Format("{0:C}", k.TotalProjectAmt);
                myResult.TotalProjectCount = k.TotalProjectCount;

            }
        }

        // send object to partial view
        return PartialView("GetAreaSelTexResult", myResult);
    }

Вот частичное представление:

@model PAA.Models.AreaSelTextResult
<p>@Model.TotalProjectCount projects</p>
<p>@Model.TotalProjectAmt total</p>

<p>
   <a href="@Model.TopProjectSnapshotLink1">@Model.TopProjectName1</a></p>
<p>
   <a href="@Model.TopProjectSnapshotLink2">@Model.TopProjectName2</a></p>
<p>
   <a href="@Model.TopProjectSnapshotLink3">@Model.TopProjectName3</a></p>

А вот javascript, который вызывает метод HttpPost изатем загружает возвращенное частичное представление в div, называемый «returnProjData»:

function retrieveSelectionSummary(selectionName, selectionType) {

    $('#goalList input:checked').each(function () {
        goals += $(this).attr('value') + ",";
    });

    var attr = { areaName: selectionName,
        areaType: selectionType,
                yearCDL: null,
                goalCDL: null,
                statusCDL: status
                };

    var json = JSON.stringify(attr);
    $.ajax({
        url: '/summary/GetAreaSelTexResult',
        type: 'POST',
        dataType: 'html',
        data: json,
        contentType: 'application/json; charset=utf-8',
        success: function (result) {
            $('#returnedProjData').html(result);
        },
        error: function () {
            alert("Error.");
        }
    });
    return attr;
}

1 Ответ

8 голосов
/ 27 января 2012

Никогда не указывайте в жестком коде такие URL:

url: '/summary/GetAreaSelTexResult',

Всегда используйте помощники URL при генерации URL:

url: '@Url.Action("GetAreaSelTexResult", "summary")',

Причина, по которой ваш код не работает при развертывании в виртуальном каталоге, заключается в том, что URL /summary/GetAreaSelTexResult больше не является правильным. Вы должны принять во внимание имя виртуального каталога сейчас: /myappname/summary/GetAreaSelTexResult. По этой причине вы никогда не должны жестко кодировать свои URL, а всегда использовать их помощники для их генерации.

И если это находится в отдельном файле javascript, где вы не можете использовать помощники на стороне сервера, вы можете определить глобальную переменную в своем представлении, которая будет указывать на правильный URL-адрес, или использовать помощники HTML5 data- * для некоторого элемента DOM, с которым вы работаете с.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...