【问题标题】:MVC2 complains that it cannot find a public action method on a controller, even though it's thereMVC2 抱怨它无法在控制器上找到公共操作方法,即使它在那里
【发布时间】:2012-08-17 04:23:43
【问题描述】:

我在 VS2008 中使用 MVC2,在视图 ~/Shared/Site.Master 中使用以下代码:

<ul id="navlist">
            <li class="first"><a href="<%= Url.Content("~")%>" id="current">Home</a></li>
            <li><a href="<%= Url.Content("~/Store/")%>">Store</a></li>
            <li>
                **<% Html.RenderAction("CartSummary","ShoppingCart"); %></li>**
            <li><a href="<%= Url.Content("~/StoreManager/") %>">Admin</a></li>
        </ul>

抛出以下异常:

执行处理程序的子请求时出错 'System.Web.Mvc.HttpHandlerUtil+ServerExecuteHttpHandlerAsyncWrapper'。

有这个内部异常:

“在控制器上找不到公共操作方法'CartSummary' 'MvcMusicStore.Controllers.ShoppingCartController'。"

...这没有任何意义。 “CartSummary”方法定义如下:

// GET: /ShoppingCart/CartSummary
[NHibernateActionFilter]
[ChildActionOnly]
[HttpGet]
public ActionResult CartSummary()
{
    var cart = ShoppingCart.GetCart(this.HttpContext, this.NSession);

    ViewData["CartCount"] = cart.GetCount();

    return PartialView("CartSummary");
}

那是什么?我在这里遗漏了什么吗?

【问题讨论】:

    标签: c# asp.net-mvc-2


    【解决方案1】:

    如果从子操作中删除 [HttpGet] 属性会发生什么?

    如果我是正确的,将使用与调用“主要操作”相同的 HTTP 动词来调用子操作。

    【讨论】:

    • 成功了。但是主要的操作也是一个 GET,那么给出了什么?
    • 总是或者有它的 Post 版本,或者可能是具有 HttpPost 属性的完全不同的操作,哪个 ViewResults 使用这个部分视图? (例如,当您将东西放入购物车时。)
    【解决方案2】:

    @Cosmo...是您的控制器“ShoppingCartController”或 ShoppingCart 的名称。如果是“ShoppingCartController”,那么 html.RenderAction 会出错,因为控制器名称不正确。

    更改为: Html.RenderAction("CartSummary","ShoppingCartController");

    【讨论】:

    • 是的,控制器名为 ShoppingCartController,根据您的建议,我将 RenderAction 的第二个参数值更改为“ShoppingCartController”,这给了我以下异常:{“路径的控制器'/'未找到或未实现 IController。"}
    • Controller 隐含在每个 MVC 控制器名称的末尾,不需要显式附加。
    【解决方案3】:

    Html.RenderAction 更改为Html.Action 或删除[ChildActionOnly] 过滤器

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-01
      • 2013-05-15
      • 2021-02-28
      • 1970-01-01
      相关资源
      最近更新 更多