【问题标题】:MVC: How Do I Link An Input Button To A Different Action?MVC:如何将输入按钮链接到不同的操作?
【发布时间】:2026-02-17 22:00:02
【问题描述】:

我在 Home.cshtml 中有这个链接(它的 ActionResult 为 public ActionResult Home()

<li class="home-links home-middleLast">@Html.ActionLink("Log out", "LogOut", "Home")</li>

假设链接到这个控制器

// /LogOut
public ActionResult LogOut()
{
    FormsAuthentication.SignOut();
    TempData.Clear();
    Session.Abandon();
    getDB.Close();
    return RedirectToAction("Home");
}

我用这个实现了这个

[Route("~/log_out")]

还有这个

routes.MapMvcAttributeRoutes();

我担心有人可以在 URL 中输入 /log_out 并退出帐户。我怎样才能做到让人们不会那样做?

我想这样做,所以您必须单击链接注销,而不是在 URL 中输入 /log_out

【问题讨论】:

  • 您可以使用 AntiForgeryToken 属性来装饰动作,详情请参阅here。但是,这将要求您的注销按钮在表单中。
  • 我没有看到任何万无一失的方法来实现这一点。任何人都可以在网络检查器中打开网络选项卡,获取 URL,然后重播。
  • @DanWilson 是否有一个 if 语句可以用来判断按钮是否被点击?
  • 当然,您可以将按钮放在表单中,并在单击并发布到LogOut 时设置隐藏输入标志。
  • @maccettura 也许我可以使用发布按钮并确定按钮是否被按下。

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


【解决方案1】:

我认为这是一种愚蠢的方式..但你可以试试这个

<li class="home-links home-middleLast"><form action="@Url.Action("LogOut","Home")" method="post"><button type="submit">Log Out</button></form></li>

并在您的操作上方添加 [HttpPost]

//LogOut
[HttpPost]
public ActionResult LogOut()
{
    FormsAuthentication.SignOut();
    TempData.Clear();
    Session.Abandon();
    getDB.Close();
    return RedirectToAction("Home");
}

但是...您必须更改“注销”按钮并对其进行样式设置,使其看起来像带有 css 的链接

【讨论】:

  • 它对我不起作用。问题是它不会访问 LogOut 控制器,因为它在 Home 控制器中。
  • hmm...这很奇怪...我假设您在 HomeController 中有一个 LogOut 方法,因此,我使用 @Url.Action("LogOut","Home") 作为 URL 形式行动。
  • 问题是这个答案中没有路由登录控制器。
【解决方案2】:

这需要脚本:

@Html.ActionLink("Log out", "LogOut", "Home", null, new { @class= "logout-btn" })

<script>
    $(function () {
        $(".logout-btn").click(function (e) {
            e.preventDefault();
            var url = $(this).attr("href");
            $.ajax({
                url: url,
                success: function (data) {
                    if (data) {
                        // change to your location
                        window.location.href = "http://*.com";
                    }
                }
            });
        });
    });
</script>

和行动:

public ActionResult LogOut()
{
    if (Request.IsAjaxRequest())
    {
        FormsAuthentication.SignOut();
        TempData.Clear();
        Session.Abandon();
        getDB.Close();
        return Json(true, JsonRequestBehavior.AllowGet);
    }

    return Json("Invalid request", JsonRequestBehavior.AllowGet);
}

【讨论】:

  • 使用 jquery 或 javascript 不好吗?我相信人们可以以消极的方式操纵这段代码。
  • 这是另一个问题的主题,如果没有 javascript,您可能无法在此处发布。
【解决方案3】:

查看

using (Html.BeginForm("LogOut", "Home", FormMethod.Post))
{
    <li class="home-links home-middleLast"><input type="submit" value="Log out"/></li>
}

控制器

[HttpPost]
[Route("")]
[Route("~/home")]
public ActionResult LogOut()
{
    FormsAuthentication.SignOut();
    TempData.Clear();
    Session.Abandon();
    getDB.Close();
    return RedirectToAction("Home");
}

我把主路由放在 LogOut 控制器上,还有 HttpPost。这只会在按下按钮时触发。

编辑:我没有使用我之前提交的答案。我其实用过这个https://*.com/a/14194770/6804700

【讨论】:

    最近更新 更多