У меня есть приложение 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;
}