4

我是第一次使用 ASP.NET MVC 4,所以我从默认模板开始。

在 _LoginPartial.cshmtl for Log off 链接中,我找到了以下代码

@using (Html.BeginForm("LogOff", "Account", FormMethod.Post, new { id = "logoutForm" })) {
    @Html.AntiForgeryToken()
    <a href="javascript:document.getElementById('logoutForm').submit()">Log off</a>
}

我期待一个像下面这样的代码,我一直在 MVC 3 中使用它。

@Html.ActionLink("Log off", "LogOff", "Account")    

请有人可以帮助我理解为什么这是必要的,以及它的优点(如果有的话)。谢谢

4

6 回答 6

3

新语法的原因是它遵循更 RESTful 的语法。通过注销,您正在更改用户的状态(因此是 POST 操作)。

于 2013-03-17T09:17:15.500 回答
2

在使 MVC 4 变得安静的同时,默认模板不允许禁用 JavaScript 的用户退出。这是解决该问题的方法。

注意我还在这里写了关于这个问题的博客:http: //www.shiningtreasures.com/post/2013/08/09/cannot-log-out-of-aspnet-mvc4-without-javascript

@using (Html.BeginForm("LogOff", "Account", FormMethod.Post, new { id = "logoutForm" })) {
    @Html.AntiForgeryToken()
    <a id="logout" href="javascript:document.getElementById('logoutForm').submit()" style="display:none">Log Off</a>
    <script>
        //<!--
        var l = document.getElementById('logout');
        if (typeof(l) != 'undefined' && l != null)
            l.style.display = "inline";
        //-->
    </script>
    <noscript>
        <input type="submit" value="Log Off" />
    </noscript>
}

基本上,当 JavaScript 不可用时,它会退回到提交按钮而不是链接。在所有情况下,我们仍然使用 POST。

另一个小问题 - 模板的 CSS 使按钮看起来与链接不同。这是 CSS 对注销按钮样式的修复,因此它看起来与实际上是锚标记的其他“按钮”相同。

/* drop this in just above "info and errors" */

#logoutForm input[type="submit"],
#logoutForm input[type="button"],
#logoutForm button
{
    background-color: #d3dce0;
    color: #333;
    border: none;
    border: 0px;
    font-size: 1em;
    font-weight: 400;
    margin: -4px 3px -4px 10px;
    padding: 2px 3px;
    text-decoration: none;
    font-family: inherit;
    outline: medium none;
}


/* for mobile styles - you need to drop this one in right after the other 
#login styles in the mobile block (near the bottom of the file) */

#login input[type="submit"],
#login input[type="button"],
#login button
{
    background: none;
    color: #999;
    border: none;
    border: 0px;
    font-size: 1em;
    font-weight: 600;
    margin: -4px 3px -4px 6px;
    padding: 0;
    text-decoration: none;
    font-family: inherit;
    outline: medium none;
}
于 2013-05-05T09:39:49.790 回答
1

没有什么大的区别。MVC4 使用 HTML 表单注销,通过 javascript 提交。

优点是新方式(使用表单)使用javascript提交表单,这就是页面不必重新加载的原因。

于 2012-11-28T10:07:00.313 回答
1

我很确定他们在这里使用 JavaScript 的唯一原因是因为提交按钮的 css 样式与“登录”按钮的 css 样式不匹配,“登录”按钮是由 HTML 助手使用以下代码创建的锚标记:

@Html.ActionLink("Log in", "Login", "Account", routeValues: null, htmlAttributes: new { id = "loginLink" }).

以下将在应用程序中创建完全相同的行为:

<input type="submit" value="Log Off" />

但它看起来很可怕。

当然,他们不能再将 HTML 帮助程序 ActionLink 用于注销按钮,因为这是一个需要发布的表单,以便可以验证 AntiForgeryToken。

因此,他们需要以下内容:

  1. 注销链接的锚标记,使其样式与登录链接相同。
  2. 一个可以提交表单以便验证 AntiForgeryToken 的按钮。

通过显式的 .submit() JavaScript 触发表单回发的锚标记。

于 2013-06-13T04:04:33.230 回答
0

“优点是新方式(带有表单)使用javascript提交表单,这就是页面不必重新加载的原因”......(user1797792)

这是完全不正确的,因为 Html.BeginForm 总是触发回发,Ajax.BeginForm 是不触发回发的异步表单助手

我更喜欢旧的操作链接样式,因为它不会弄乱 css,但是从查看功能来看,操作链接似乎已被替换为表单,因此 AntiForgeryToken 可以包含在请求中,并且可以防止跨站点脚本阻止你自己帐户或类似的东西。

于 2013-05-10T08:30:52.647 回答
0
function btnContinueClick() {
    debugger
    $.ajax({
        url: '@Url.Action("BIAssessmentTest", "BI")',
        type: 'Post',
        cache: false,
        success: function (data) {

            window.location.href = '@Url.Action("BIAssessQuestions", "BI")';
        },

        error: function (err) {
             debugger
            alert("hi");
        }
    });

}
于 2015-12-30T10:33:59.507 回答