如何解决"公共行动方法'方法行动名称'在控制器上找不到&controllerNameController'"

时间:2016-01-07 02:15:57

标签: asp.net-mvc asp.net-mvc-4

我收到此错误

  

公共行动方法' consultaCumplimientoOptometras'没找到   在控制器' NovedadesCumplimientosController'。

以下是名为 CumplimientoOptometras.cshtml 的整个视图

@{
    ViewBag.Title = "Cumplimiento por Optometras";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Cumplimiento por Optometras</h2>

<!-- Resultado de la Consulta de Cumplimientos -->
@Html.Action("consultaCumplimientoOptometras") 

我在 NovedadesCumplimientosController

中有以下方法
[HttpGet]
public PartialViewResult consultaCumplimientoOptometras(String x)
{
    List<CumplimientoOptometraDTO> lstCumplimientosOpts;

    lstCumplimientosOpts = new List<CumplimientoOptometraDTO>();

    return PartialView("_consultaCumplimientoOptometras", lstCumplimientosOpts);
}

以下是部分视图 _consultaCumplimientoOptometras.cshtml

@model List<CumplimientoOptometraDTO>

<table border="1">
    <tr>
        <td>Id Opt&oacute;metra</td>
        <td>Nombre Opt&oacute;metra</td>
        <td>Horas Laboradas</td>
        <td>Meta Mensual</td>
        <td>Venta Mensual</td>
        <td>% Cumplimiento</td>
        <td>Valor Comisi&oacute;n</td>
    </tr>

    @foreach (var cumpl in Model)
    {
        <tr>
            <td>@cumpl.idOptometra</td>
            <td>@cumpl.nombreOptometra</td>
            <td>@cumpl.horasLaboradas</td>
            <td>@cumpl.metaMensual</td>
            <td>@cumpl.ventaMensual</td>
            <td>@cumpl.porcentajeCumplimiento</td>
            <td>@cumpl.valorComision</td>
        </tr>
    }
</table>

这是 CumplimientoOptometraDTO 类/模型

using System;

public class CumplimientoOptometraDTO
{
    public Int32 idOptometra { get; set; }
    public String nombreOptometra { get; set; }
    public Int32 horasLaboradas { get; set; }
    public Decimal metaMensual { get; set; }
    public Decimal ventaMensual { get; set; }
    public Decimal porcentajeCumplimiento { get; set; }
    public Decimal valorComision { get; set; }
}

在帖子的开头提到错误 在尝试显示视图 CumplimientoOptometras.cshtml

此行的确切

这是臭名昭着的 RouteConfig

@Html.Action("consultaCumplimientoOptometras") 

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}

2 个答案:

答案 0 :(得分:1)

如果从方法中删除 [HttpGet] ,则 还删除了未使用的参数(String x),它现在可以正常工作

    //[HttpGet]
    public PartialViewResult consultaCumplimientoOptometras()
    {
        List<CumplimientoOptometraDTO> lstCumplimientosOpts;

        lstCumplimientosOpts = new List<CumplimientoOptometraDTO>();

        return PartialView("_consultaCumplimientoOptometras", lstCumplimientosOpts);
    }

我正在复制我之前看过的模式,同样的控制器方法也被从JQuery gith请求中调用/重用,这就是最初添加 [HttpGet] 的原因。

对于这种特殊情况,因为此代码目前不会从JQuery调用,所以我可以安全地删除 [HttpGet] 。这仍然感觉更像是“通过实际学习或找到根本原因解决”并继续工作场景; - )

如果你找到这个问题寻找答案而且这里没有任何一个可以为你工作,你可以通过一个问题链接对这个答案发表评论

在寻找这个问题的答案时,我发现这篇关于如何在同一控制器方法上接受不同HTTP VERBS的非常好的帖子

<强> http://www.dotnetexpertguide.com/2012/11/aspnet-mvc-acceptverbs-action-filter.html

如果找到了真正的原因

,则更新

如果您有多个以POST开头的调用层(主视图CumplimientoOptometras.cshtml因POST操作而重新生成),然后调用 @ Html.Action 甚至 RenderAction 仍然会寻找POST方法!!这是一个限制/错误或我无法正确理解的东西)

因此,如果您想继续接受HTTP GET动词并将级联后请求的问题修复为get请求,请将此添加到您的方法

[AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post)]

请记住[HttpGet]与 [AcceptVerbs(HttpVerbs.Get)]

相同

答案 1 :(得分:0)

当您在一个控制器( Ex HomeController)中定义子操作方法并尝试从属于另一个控制器的视图中调用此方法时,通常会发生这种情况( Ex NovedadesCumplimientosController)。

您可以使用Html.Action()方法的另一个重载,您可以在其中指定操作名称和控制器名称。

@Html.Action("consultaCumplimientoOptometras","Home") 

假设您在consultaCumplimientoOptometras

中定义了HomeController