找不到操作方法 - 即使它在控制器中

时间:2015-01-25 17:23:34

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

阅读完文档后我的假设是我们可以使用@ 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>

启动程序后,在调试过程中,似乎没有点击#sendButton就会调用DidItWork() - 为什么会这样?

当单步执行时,只要用户名和电子邮件是唯一的,所有内容都会正常工作。但是,最后,一旦完成,它将转到@Html.Action("DidItWork", "Home")行并抛出异常。

解决这个问题的想法/建议?例外信息如下:

  

类型&#39; System.Web.HttpException&#39;的例外情况发生在   System.Web.dll但未在用户代码中处理   信息:执行处理程序的子请求时出错   &#39; System.Web.Mvc.HttpHandlerUtil + ServerExecuteHttpHandlerAsyncWrapper&#39 ;.   内部例外:{&#34;视图&#39; DidItWork&#39;或者没有找到它的主人   没有视图引擎支持搜索的位置。下列   搜索了位置:...&#34;}

2 个答案:

答案 0 :(得分:2)

  

阅读完文档后我的假设是我们   可以使用@ 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>

答案 1 :(得分:1)

此代码段

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

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