ASP MVC3: acción HttpPost no encontrada después de publicar
Tengo una aplicación ASP MVC3 que tiene varios métodos HttpPost ActionResult. Durante una sesión de depuración, los métodos funcionan bien. Pero cuando publico y veo la aplicación web en el navegador, solo los métodos HttpPost fallan. Firebug muestra un "404 no encontrado". Otros métodos que no son HttpPost en el mismo controlador funcionan bien.
ACTUALIZAR
1) La URL publicada para la aplicación es localhost / psp. 2) Todas las acciones GET devuelven URL dehttp: // localhost / psp / 'controlador' / 'acción'.
3) Las acciones POST están devolviendo URL dehttp: // localhost / 'controlador' / 'acción'.
Así que esto parece ser un problema de enrutamiento. La única ruta que tengo en mi archivo Global.asax.cs es:
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
Tenga en cuenta que el controlador de inicio NO contiene ninguna de las acciones HttpPost. Todos los métodos POST que fallan están en un controlador separado. He intentado ajustar esta ruta a:psp/{controller}/{action}/{id}
pero luego recibo un error 403.14 (FYI estoy usando IIS 7.5).
Me desconcierta por qué estos métodos HttpPost funcionan durante la depuración pero no en una aplicación publicada. Este es uno de los métodos que obtienen el error 404 después de ser publicado:
[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);
}
Aquí está la vista parcial:
@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>
Y aquí está el javascript que llama al método HttpPost y luego carga la vista parcial devuelta en un div llamado "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;
}