我有一个ASP MVC3应用程序,它有几个HttpPost ActionResult方法。在调试会话期间,方法可以正常工作。但是当我在浏览器中发布和查看Web应用程序时,只有HttpPost方法失败。 Firebug显示“未找到404”。同一控制器中的其他非HttpPost方法工作正常。
更新:
1)该应用程序的已发布网址是localhost / psp。 2)所有GET操作都返回http://localhost/psp/'controller'/'action'的URL 3)POST操作返回http://localhost/'controller'/'action'的URL。
所以这似乎是一个路由问题。我在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>
这是调用HttpPost方法的javascript,然后将返回的局部视图加载到名为“returnedProjData”的div中:
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;
}
答案 0 :(得分:8)
永远不要硬编码这样的网址:
url: '/summary/GetAreaSelTexResult',
生成网址时始终使用网址助手:
url: '@Url.Action("GetAreaSelTexResult", "summary")',
将代码部署到虚拟目录中时,代码无效的原因是因为网址/summary/GetAreaSelTexResult
不再正确。您现在必须考虑虚拟目录名称:/myappname/summary/GetAreaSelTexResult
。出于这个原因,你永远不应该硬编码你的网址,但总是使用网址助手来生成它们。
如果这是在一个单独的javascript文件中,你不能使用服务器端助手,你可以在视图中定义一个全局变量,它将指向正确的url或在你工作的某些DOM元素上使用HTML5 data- * helper用。