【问题标题】:ASP MVC3 - HttpPost action not found after publishASP MVC3 - 发布后未找到 HttpPost 操作
【发布时间】:2012-02-20 05:32:29
【问题描述】:

我有一个 ASP MVC3 应用程序,它有几个 HttpPost ActionResult 方法。在调试会话期间,这些方法工作正常。但是当我在浏览器中发布和查看 Web 应用程序时,只有 HttpPost 方法失败。 Firebug 显示“404 未找到”。同一控制器中的其他非 HttpPost 方法工作正常。

更新:

1) 应用发布的 url 是 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 方法然后将返回的局部视图加载到名为“returnedProjData”的 div 中的 javascript:

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;
}

【问题讨论】:

  • 你能发布呈现表单的视图代码吗? POST 返回 404 后,浏览器中的 URL 是什么?你是通过 AJAX 调用这个吗?
  • 我同意,这听起来更像是一个路由问题,而不是一个从未调用过的操作方法的问题。
  • @MartinNH - 是的,这似乎是您建议的路由问题。请查看帖子顶部附近的更新。 Post 操作的 URL 缺少应用程序目录。感谢您的帮助。

标签: asp.net-mvc-3 http-post


【解决方案1】:

永远不要像这样硬编码网址:

url: '/summary/GetAreaSelTexResult',

在生成 url 时始终使用 url 助手:

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

您的代码在虚拟目录中部署时不起作用的原因是 URL /summary/GetAreaSelTexResult 不再正确。您现在必须考虑虚拟目录名称:/myappname/summary/GetAreaSelTexResult。出于这个原因,你永远不应该对你的 url 进行硬编码,而总是使用 url helper 来生成它们。

如果这是在一个单独的 javascript 文件中,您不能使用服务器端助手,您可以在视图中定义一个全局变量,该变量将指向正确的 url 或在您正在工作的某些 DOM 元素上使用 HTML5 data-* 助手与。

【讨论】:

  • 这非常有效。感谢您帮助我理解这个问题。
  • 谢谢,这正是我的问题。
  • @Darin 嗨,我使用一个单独的 javascript 文件来进行 get 和 post 调用,你能举个例子来说明如何在视图中而不是 JS 文件中定义变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-08
  • 1970-01-01
  • 2015-12-27
  • 2014-12-16
  • 2021-02-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多