MVC - URL.Action给出资源未找到错误

时间:2014-11-30 16:17:30

标签: razor asp.net-mvc-5

我在_Layout.cshtml文件中有以下内容:

<a href="@Url.Action("LogOff", "Account")"><span class="fa fa-files-o"></span> <span class="xn-text">NEW Log Out</span></a>

但是,当我点击链接时,我收到“无法找到资源”错误消息。

描述:HTTP 404.您正在查找的资源(或其中一个依赖项)可能已被删除,名称已更改或暂时不可用。请查看以下网址,确保拼写正确。

请求的网址:/帐户/登录

帐户控制器尚未编辑或移动,与默认MVC 5模板的状态相同。

呈现的HTML是:

<a href="/Account/LogOff"><span class="fa fa-files-o"></span> <span class="xn-text">NEW Log Out</span></a>

编辑:我可以从不使用_layout屏幕的屏幕登录,因此可以在应用程序的其他部分找到帐户控制器。登录然后转到主页/索引操作并返回带有布局的索引视图。

此外,帐户控制器尚未以任何方式进行编辑,所有方法,声明,所有内容都不会保留原始默认模板。控制器位于代码的另一部分,因为登录功能正常工作。

2 个答案:

答案 0 :(得分:1)

您需要Controller名为AccountController,并在其上设置一个名为LogOff的方法,以使其正常工作。

结构应该是这样的:

[Authorize]
public class AccountController : Controller
{
    public AccountController()
    {
    }

    public ActionResult LogOff()
    {
        // logout code here
        return RedirectToAction("Index", "Home"); // this you can change in whatever you like
    }
}

答案 1 :(得分:1)

根据您的评论:

  

哦,你至少需要一个[HttpPost]。加上一些实际注销的代码,而不仅仅是重定向到主页也可能有用

您的问题听起来像是服务器逻辑中的代码注释了[HttpPost],如果是,那么您的HREF正在寻找显然不存在的GET Action / ViewResult。

您可以通过以下三种方式之一解决此问题。从服务器逻辑中删除[HttpPost]它应该有效(绝对不是最佳做法),或者您可以重新调整视图以执行以下操作之一:

解决方案一 - 最初查看互联网应用模板的方式

@using (Html.BeginForm("LogOff", "Account", FormMethod.Post, new { 
            @class = "no-margin", id = "logoutForm"}))
{
    @Html.AntiForgeryToken()
}

<a href="javascript:document.getElementById('logoutForm').submit()">
    <span class="fa fa-files-o"></span> <span class="xn-text">NEW Log Out</span>
</a>

解决方案二 - 与上述方法略有不同

@using (Html.BeginForm("LogOff", "Account", FormMethod.Post, null}))
{
    @Html.AntiForgeryToken()

    <button type="submit">
        <span class="fa fa-files-o"></span> <span class="xn-text">NEW Log Out</span>
    </button>
}

在LogOff操作中,您只需执行以下操作:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult LogOff()
{
    WebUserSecurity.Logout();
    Session.Abandon();

    return RedirectToAction("Login", "Account");
}