【问题标题】:Action Method Not Found -- Even Though It IS In The Controller未找到操作方法——即使它在控制器中
【发布时间】:2015-01-25 17:23:33
【问题描述】:

阅读文档后,我的假设是我们可以使用 @Html.Action("ActionName", "ControllerName") 从视图中调用控制器中的操作方法。

这是一个错误的假设吗?因为如果我的逻辑/假设一开始就错了,知道会很有帮助。

我的 HomeController.cs 中有以下代码

[AllowAnonymous]
public async Task<ActionResult> DidItWork()
{
        var dash = "dash equals nash";

        var manager = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
        var user = new ApplicationUser { UserName = "test2 username2", Email = "testemail2@gmail.com" };
        var result = await manager.CreateAsync(user, "passwordGoesHere1!");
        if (result.Succeeded)
        {
            await manager.SendEmailAsync(user.Id, "Confirm your account", "Please confirm your account");

            return View();
        }

        //AddErrors(result);
        return View();    
}

我的 _Layout.cshtml 中有以下脚本

    @*script for someone who presses the send/email button*@ 
    <script>
        $("#sendButton").click(function () {
            alert("Handler for .click() called.");
            @Html.Action("DidItWork", "Home")
        });
    </script>

在启动程序时以及在调试过程中,DidItWork() 似乎在没有点击过 #sendButton 的情况下被调用——这是为什么呢?

单步执行时,只要用户名和电子邮件是唯一的,一切似乎都可以正常工作。但是,最后,一旦完成,它会转到@Html.Action("DidItWork", "Home") 行并引发异常。

解决此问题的想法/建议?异常信息如下:

“System.Web.HttpException”类型的异常发生在 System.Web.dll 但未在用户代码中处理 附加 信息:执行处理程序的子请求时出错 'System.Web.Mvc.HttpHandlerUtil+ServerExecuteHttpHandlerAsyncWrapper'。 内部异常:{“未找到视图‘DidItWork’或其主人,或 没有视图引擎支持搜索的位置。以下 已搜索位置:..."}

【问题讨论】:

  • 这表示未找到 view,而不是 action。您确定在适当的位置有 DidItWork 视图吗?
  • 你使用了错误的助手使用Url.Action()
  • 谢谢@KirkWoll 我没有 DidItWork 在适当的位置,因为我没有 DidItWork 视图——我认为 Html.Action 做了一些不同的事情。正如 Ehsan 提到的,我将尝试使用 Url.Action() 。也感谢 Ehsan。

标签: c# asp.net-mvc twitter-bootstrap razor html-helper


【解决方案1】:

阅读完文档后,我的假设是,我们 可以使用 @Html.Action("ActionName", "ControllerName") 来调用 视图中控制器中的操作方法。

这是一个错误的假设吗?

没有。

在启动程序和调试期间,DidItWork() 似乎在没有单击#sendButton 的情况下被调用——为什么是 那个?

因为这就是 Html.Action 助手的工作方式。它调用服务器上的操作并将该操作的结果插入到视图中。

解决此问题的想法/建议?异常信息如下:

由于您正在谈论使用 javascript 调用操作,因此您不应该使用服务器端视图呈现,例如 Html.Action,而是使用客户端脚本。例如,您可以使用 AJAX:

<script>
    $("#sendButton").click(function () {
        $.ajax({
            url: '@Url.Action("DitItWork", "Home")',
            success: function(reuslt) {
                // result will contain the execution of the DidItWork action.
                // Right now it is an error, because you don't seem to have defined
                // a DidItWork.cshtml page. Once you fix this it will work
                // as expected
                // Here you probably want to insert the result somewhere
                // in your markup
            }
        });
        // return false to cancel the default action and leave the AJAX call
        return false;
    });
</script>

【讨论】:

  • 我需要 ajax 还是可以通过在原始代码中交换 Http 和 Url 部分来调用 Url.Action?我只是问,因为@EhsanSaijad 提到我在上面使用了错误的助手,但没有提到 ajax。也感谢达林的解释。我对服务器/客户端仍然没有很好的掌握,所以我可以研究更多。
  • Url.Action 返回一个指向 url 的字符串。它不执行操作。 Html.Action 助手在服务器上执行操作。如果您想在从客户端单击按钮时执行某些控制器操作,您可以使用 AJAX 或将浏览器重定向到目标 url。
  • 再次感谢您的澄清。至于我使用该方法并调试 DidItWork 方法时的原始答案,似乎从未被调用过。但是,它似乎确实经历了创建新 UserManager 所需的所有步骤(例如,ApplicationDbContext : IdentityDbContext)。需要澄清的是,当您说“结果将包含 DidItWork 操作的执行”时,您指的是什么?
【解决方案2】:

这段代码

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

调用 DidItWork 操作和您的代码返回 View()。实际上,在构建期间您可以打开 Home/DidItWork.cshtml 因此您必须将您的 return 语句更改为现有视图。

【讨论】:

  • 谢谢 Acebisli -- 我认为返回现有视图只是 return View();但听起来情况并非如此。你如何回到现有的观点?那是我需要提前知道的我手动输入的东西吗(例如,return View("Index"))
  • 是的,您可以使用 View("~/Views/Product/Detail.cshtml", model);
  • 酷,不知道所以感谢分享信息
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-19
  • 1970-01-01
  • 2013-08-31
  • 2019-02-16
  • 1970-01-01
相关资源
最近更新 更多