【问题标题】:MVC RedirectToAction not working - getting "The resource cannot be found"MVC RedirectToAction 不起作用 - 获取“找不到资源”
【发布时间】:2021-01-24 15:23:07
【问题描述】:

在我的 UserController 中,我发出:

return RedirectToAction("SignOut", "SignIn");

但得到:

“/”应用程序中的服务器错误。

找不到资源。 描述:HTTP 404。您正在寻找的资源(或其依赖项之一)可能是 已删除、更改名称或暂时不可用。请查看以下 URL 和 确保拼写正确。

请求的 URL:/SignIn/SignOut

SignInController 动作方法:

[HttpPost]
public ActionResult SignOut()
{
    // Setting cache.
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    Response.Cache.SetExpires(DateTime.Now.AddSeconds(-1));
    Response.Cache.SetNoStore();

    // Setting cookies.
    // Instantiate a Cookie.
    HttpCookie Cookies = new HttpCookie("Gbng");
    Cookies.Value = "";
    Cookies.Expires = DateTime.Now.AddHours(-1);
    Response.Cookies.Add(Cookies);

    HttpContext.Session.Clear();

    Session.Abandon();

    // Redirect to the Home controller.
    return RedirectToAction("Index", "Home");
}

我有一个引用相同操作方法但具有 POST 方法的部分视图:

@if ( (string)@Session["IsAuthenticated"] == "true" )
{
    using (Html.BeginForm("SignOut", "SignIn", FormMethod.Post, new { id = 
"signoffForm", @class = "navbar-right" }))
    {
        @Html.AntiForgeryToken()

        <ul class="nav navbar-nav navbar-right">
           <li>
               <a 
href="javascript:document.getElementById('signoffForm').submit()">Sign 
out</a>
            </li>
        </ul>
    }
}
else
{
    <ul class="nav navbar-nav navbar-right">
        <li>@Html.ActionLink("Register", "Register", "Register", 
routeValues: null, htmlAttributes: new { id = "registerLink" })</li>
        <li>@Html.ActionLink("Sign in", "SignIn", "SignIn", routeValues: 
null, htmlAttributes: new { id = "signLink" })</li>
    </ul>
}

【问题讨论】:

  • 我删除了 [HttpPost] 并将其替换为 [AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post)]。现在它找到了。我可以组合请求方法属性,因为此操作服务于来自多个动词的请求。

标签: asp.net-mvc


【解决方案1】:

RedirectToAction,正在执行HTTP GET

您的SignOut 方法被[HttpPost] 修饰,因此它找不到资源。


因为SignOut 是一个典型的post 动作——即;按一个按钮等,我建议将注销逻辑放在一个单独的方法中,然后从你想使用它的地方调用它。这意味着您无需重定向即可执行签核。


从您的评论来看;您可以创建一个辅助方法来执行任务:

public class Helper
{
    public static void SignOut(System.Web.SessionState.HttpSessionState session,
                               HttpResponse response)
    {
        // Setting cache.
        response.Cache.SetCacheability(HttpCacheability.NoCache);
        response.Cache.SetExpires(DateTime.Now.AddSeconds(-1));
        response.Cache.SetNoStore();

        // Setting cookies.
        // Instantiate a Cookie.
        HttpCookie Cookies = new HttpCookie("Gbng");
        Cookies.Value = "";
        Cookies.Expires = DateTime.Now.AddHours(-1);
        response.Cookies.Add(Cookies);

        session.Clear();

        session.Abandon();
    }
}

然后在两个函数中调用它;你可以重定向 - 我现在没有编译器可供我使用,但我认为你可以解决任何不准确之处。

[HttpPost]
public ActionResult SignOut()
{
    Helper.SignOut(Response, Session);
    return RedirectToAction("Index", "Home");
}
[HttpPost]
public ActionResult OtherAction()
{
    Helper.SignOut(Response, Session);
    return RedirectToAction("Index", "Home");
}

【讨论】:

  • Stefan...我的部分视图说明了 Post 方法,所以我用它来装饰我的方法。那么我如何告诉 RedirectToAction 它是一个 Post 方法呢?我尝试将 [AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post)] 放在 [HttpPost] 下方,但它什么也没做。
  • 我删除了 [HttpPost] 并将其替换为 [AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post)]。现在它找到了。
  • Stefan...我实际上有 2 个控制器来重定向到 SignInController 操作方法。因此,如果我要使用您的建议,我将不得不在全局方法中复制该操作方法代码。所以我将在 2 个地方拥有相同的确切代码。这是明智的还是像我一样只在一个地方使用装饰?
猜你喜欢
  • 2015-04-12
  • 1970-01-01
  • 2013-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多